Restringindo botões

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Atendido / Resolvido Restringindo botões

Mensagem por JR_Junior em 10.10.17 5:41

Detalhes da questão


Endereço do fórum: http://darkstreetrpg.forumeiros.com
Versão do fórum: phpBB3

Descrição


Olá!
Tenho um script que habilita o uso de botões personalizados nos tópicos(Em curso, Resolvido, Recusado, etc).

Está funcionando normalmente: Quem criou o tópico e os moderadores conseguem ver os botões.

Mas o problema é que num tópico que somente um moderador pode decidir se foi resolvido ou não, isso dá conflito.

Meu pedido: Configurar para cada botão aparecer somente nos tópicos que eu selecionar e somente para os grupos que eu selecionar.

Dede já agradeço!

Código do script:
Código:

/*globals jQuery, FA*/
        /**
        * Alterar o ícone do tópico com AJAX.
        *
        * @author Luiz
        * @version {alpha} 1.0
        * @licence MIT
        */
       
        (function ($) {
          'use strict';
       
          var config = [
            { name: 'Resolvido', id  : 1, background: '#8b5' },
          ];
       
          window.FA = window.FA || {};
          FA.Topic = FA.Topic || {};
       
          var MarkIcon;
          FA.Topic.MarkIcon = MarkIcon = function (config) {
            var self = this;
       
            self.userConfig = config;
            self.defaults = { name: undefined, id: undefined, background: undefined };
            self.config = $.extend({}, self.defaults, self.userConfig);
       
            $.each(self.config, function (key, value) {
              if (key === undefined) {
                throw new Error ('Não foi especificado um: '  key  ' para o script de botões.');
              }
            });
          };
       
          MarkIcon.prototype.init = function () {
            var self = this;
       
            var $post = $('.post:first');
            var $link = $post.find('a[href$="mode=editpost"]');
       
            if (!$link.length) {
              return;
            }
       
            self.messageLink = $link.attr('href');
       
            self.$button = $('<button>', {
              'class'  : 'fa-mark-icon-button',
              'data-id': self.config.id,
              'text'  : self.config.name
            });
       
            self.$button
              .css('background-color', self.config.background)
              .on('click', function (event) {
                event.preventDefault();
       
                self.runAjax();
              })
              .insertBefore($post)
            ;
       
            self.appendStyles();
          };
       
          MarkIcon.prototype.runAjax = function () {
            var self = this;
       
            self.changeText('<i class="fa fa-refresh fa-spin"></i> Marcando...');
       
            $.get(self.messageLink)
              .done(function (context) {
                var $form = $('form[action="/post"]', context);
       
                $form.find('input[name="post_icon"]').val(self.config.id);
                $form.find('input[name="edit_reason"]').remove();
       
                var encode = document.charset.toLowerCase() === 'utf-8' ? window.encodeURIComponent : window.escape;
       
                var data = $form.serializeArray().reduce(function (object, pair) {
                  object[pair.name] = pair.value;
                  return object;
                }, {
                  post_icon: self.config.id,
                  post: 1
                });
       
                var encoded = $.map(data, function (value, key) {
                  return key  '='  encode(value);
                }).join('&');
       
                $.post(self.messageLink, encoded)
                  .done(self.changeText('<i class="fa fa-check"></i> Marcado!'))
                  .fail(self.error)
                ;
              })
              .fail(self.error)
            ;
          };
       
          MarkIcon.prototype.changeText = function (text) {
            var self = this;
       
            self.runAjax = function () {
              return false;
            };
       
            self.$button
              .html(text)
              .prop('disabled', true)
            ;
          };
       
          MarkIcon.prototype.error = function () {
            var self = this;
           
            alert([
              'Houve um erro ao marcar o tópico como "'  self.config.name  '".',
              'Por favor, contate o suporte técnico.'
            ].join('\n'));
          };
       
          MarkIcon.prototype.appendStyles = function () {
            $('<style>', {
              'text': [
                '.fa-mark-icon-button {',
                '  padding: 8px 8px 8px 8px;',
                '  border: none;',
                '  color: #fff;',
                '  margin: 10px 0;',
                '  box-shadow: inset 0 0 0 3px rgba(0, 0, 0, 0.08);',
                '  border-radius: 3px;',
                '}'
              ].join('\n')
            }).appendTo('head');
          };
       
          $(function () {
            $.each(config, function () {
              var self = this;
       
              (new FA.Topic.MarkIcon(self)).init();
            });
          });
        }(jQuery));
JR_Junior

JR_Junior
Nível 5

Masculino
Inscrito dia : 10/05/2012
Mensagens : 46
Pontos Ativos : 79

Ver perfil do usuário http://darkstreet-server.livreforum.com

Atendido / Resolvido Re: Restringindo botões

Mensagem por Luiz em 10.10.17 12:00

Troque por este:
Código:
/*globals jQuery, FA*/
 
/**
 * Alterar o ícone do tópico com AJAX.
 *
 * @author Luiz
 * @version 1.2
 * @licence MIT
 */
 
(function ($) {
  'use strict';
 
  var config = [
    { name: 'Resolvido', id  : 4, background: '#8b5', onlyForMod: true },
    { name: 'Em Curso', id  : 1, background: '#ebb537' },
    { name: 'Importante', id: 5, background: '#e3493b', onlyForAdmin: true }
  ];
 
  window.FA = window.FA || {};
  FA.Topic = FA.Topic || {};
 
  var MarkIcon;
  FA.Topic.MarkIcon = MarkIcon = function (config) {
    var self = this;
 
    self.userConfig = config;
    self.defaults = {
      name: undefined,
      id: undefined,
      background: undefined,
      onlyForMod: false,
      onlyForAdmin: false
    };
   
    self.config = $.extend({}, self.defaults, self.userConfig);
 
    $.each(self.config, function (key, value) {
      if (key === undefined) {
        throw new Error ('Não foi especificado um: ' + key + ' para o script de botões.');
      }

      if (value === undefined) {
        throw new Error ('Não foi especificado um valor: ' + value + ' para o script de botões.');
      }
    });
  };
 
  MarkIcon.prototype.init = function () {
    var self = this;
 
    var $post = $('.post:first');
    var $link = $post.find('a[href$="mode=editpost"]');
 
    if (!$link.length) {
      return false;
    }

    if (this.config.onlyForMod && (_userdata.user_level !== 1 && _userdata.user_level !== 2)) {
      return false;
    }

    if (this.config.onlyForAdmin && _userdata.user_level !== 1) {
      return false;
    }
 
    self.messageLink = $link.attr('href');
 
    self.$button = $('<button>', {
      'class'  : 'fa-mark-icon-button',
      'data-id': self.config.id,
      'text'  : self.config.name
    });
 
    self.$button
      .css('background-color', self.config.background)
      .on('click', function (event) {
        event.preventDefault();
 
        self.runAjax();
      })
      .insertBefore($post)
    ;
 
    self.appendStyles();
  };
 
  MarkIcon.prototype.runAjax = function () {
    var self = this;
 
    self.changeText('<i class="fa fa-refresh fa-spin"></i> Marcando...');
 
    $.get(self.messageLink)
      .done(function (context) {
        var $form = $('form[action="/post"]', context);
 
        var encode  = document.charset.toLowerCase() === 'utf-8' ? window.encodeURIComponent : window.escape;
 
        var formData = $form.serializeArray();
 
        var data = {};
        $.each(formData, function () {
          var obj = this;
 
          data[obj.name] = obj.value;
        });
 
        data.post_icon = self.config.id;
        data.post = 1;
 
        var encoded = $.map(data, function (value, key) {
          return key + '=' + encode(value);
        }).join('&');
 
        $.post(self.messageLink, encoded)
          .done(self.changeText('<i class="fa fa-check"></i> Marcado!'))
          .fail(self.error)
        ;
      })
      .fail(self.error)
    ;
  };
 
  MarkIcon.prototype.changeText = function (text) {
    var self = this;
 
    self.runAjax = function () {
      return false;
    };
 
    self.$button
      .html(text)
      .prop('disabled', true)
    ;
  };
 
  MarkIcon.prototype.error = function () {
    var self = this;
 
    alert([
      'Houve um erro ao marcar o tópico como "' + self.config.name + '".',
      'Por favor, contate o suporte técnico.'
    ].join('\n'));
  };
 
  MarkIcon.prototype.appendStyles = function () {
    $('<style>', {
      'text': [
        '.fa-mark-icon-button {',
        '  padding: 8px 8px 8px 8px;',
        '  border: none;',
        '  color: #fff;',
        '  margin: 10px 0 10px 6px;',
        '  box-shadow: inset 0 0 0 3px rgba(0, 0, 0, 0.08);',
        '  border-radius: 3px;',
        '}'
      ].join('\n')
    }).appendTo('head');
  };
 
  $(function () {
    $.each(config, function () {
      var self = this;
 
      (new FA.Topic.MarkIcon(self)).init();
    });
  });
}(jQuery));

Como o senhor pode ver no array de configuração:
Código:
var config = [
  { name: 'Resolvido', id  : 4, background: '#8b5', onlyForMod: true },
  { name: 'Em Curso', id  : 1, background: '#ebb537' },
  { name: 'Importante', id: 5, background: '#e3493b', onlyForAdmin: true }
];

Há um botão com uma configuração "onlyForMod". Se estiver marcada como true, somente moderadores e administradores poderão ver o botão daquele objeto.

Há um outro botão, também, configurado como "onlyForAdmin". Se essa configuração estiver marcada como true, somente administradores poderão ver o botão.

É importante frisar que essas configurações como false é como se elas não existissem, logo, só as mantenha no objeto caso elas estiverem como true.

Note que para ambos os casos, a edição daquela postagem ainda deve estar ativa!

o/
Luiz

Luiz
Principal contribuidor
Principal contribuidor

Masculino
Inscrito dia : 23/04/2016
Mensagens : 6626
Pontos Ativos : 7521

Ver perfil do usuário https://luizfelipe.dev

Atendido / Resolvido Re: Restringindo botões

Mensagem por JR_Junior em 10.10.17 14:44

@Luiz escreveu:Troque por este:
Código:
/*globals jQuery, FA*/
 
/**
 * Alterar o ícone do tópico com AJAX.
 *
 * @author Luiz
 * @version 1.2
 * @licence MIT
 */
 
(function ($) {
  'use strict';
 
  var config = [
    { name: 'Resolvido', id  : 4, background: '#8b5', onlyForMod: true },
    { name: 'Em Curso', id  : 1, background: '#ebb537' },
    { name: 'Importante', id: 5, background: '#e3493b', onlyForAdmin: true }
  ];
 
  window.FA = window.FA || {};
  FA.Topic = FA.Topic || {};
 
  var MarkIcon;
  FA.Topic.MarkIcon = MarkIcon = function (config) {
    var self = this;
 
    self.userConfig = config;
    self.defaults = {
      name: undefined,
      id: undefined,
      background: undefined,
      onlyForMod: false,
      onlyForAdmin: false
    };
   
    self.config = $.extend({}, self.defaults, self.userConfig);
 
    $.each(self.config, function (key, value) {
      if (key === undefined) {
        throw new Error ('Não foi especificado um: ' + key + ' para o script de botões.');
      }

      if (value === undefined) {
        throw new Error ('Não foi especificado um valor: ' + value + ' para o script de botões.');
      }
    });
  };
 
  MarkIcon.prototype.init = function () {
    var self = this;
 
    var $post = $('.post:first');
    var $link = $post.find('a[href$="mode=editpost"]');
 
    if (!$link.length) {
      return false;
    }

    if (this.config.onlyForMod && (_userdata.user_level !== 1 && _userdata.user_level !== 2)) {
      return false;
    }

    if (this.config.onlyForAdmin && _userdata.user_level !== 1) {
      return false;
    }
 
    self.messageLink = $link.attr('href');
 
    self.$button = $('<button>', {
      'class'  : 'fa-mark-icon-button',
      'data-id': self.config.id,
      'text'  : self.config.name
    });
 
    self.$button
      .css('background-color', self.config.background)
      .on('click', function (event) {
        event.preventDefault();
 
        self.runAjax();
      })
      .insertBefore($post)
    ;
 
    self.appendStyles();
  };
 
  MarkIcon.prototype.runAjax = function () {
    var self = this;
 
    self.changeText('<i class="fa fa-refresh fa-spin"></i> Marcando...');
 
    $.get(self.messageLink)
      .done(function (context) {
        var $form = $('form[action="/post"]', context);
 
        var encode  = document.charset.toLowerCase() === 'utf-8' ? window.encodeURIComponent : window.escape;
 
        var formData = $form.serializeArray();
 
        var data = {};
        $.each(formData, function () {
          var obj = this;
 
          data[obj.name] = obj.value;
        });
 
        data.post_icon = self.config.id;
        data.post = 1;
 
        var encoded = $.map(data, function (value, key) {
          return key + '=' + encode(value);
        }).join('&');
 
        $.post(self.messageLink, encoded)
          .done(self.changeText('<i class="fa fa-check"></i> Marcado!'))
          .fail(self.error)
        ;
      })
      .fail(self.error)
    ;
  };
 
  MarkIcon.prototype.changeText = function (text) {
    var self = this;
 
    self.runAjax = function () {
      return false;
    };
 
    self.$button
      .html(text)
      .prop('disabled', true)
    ;
  };
 
  MarkIcon.prototype.error = function () {
    var self = this;
 
    alert([
      'Houve um erro ao marcar o tópico como "' + self.config.name + '".',
      'Por favor, contate o suporte técnico.'
    ].join('\n'));
  };
 
  MarkIcon.prototype.appendStyles = function () {
    $('<style>', {
      'text': [
        '.fa-mark-icon-button {',
        '  padding: 8px 8px 8px 8px;',
        '  border: none;',
        '  color: #fff;',
        '  margin: 10px 0 10px 6px;',
        '  box-shadow: inset 0 0 0 3px rgba(0, 0, 0, 0.08);',
        '  border-radius: 3px;',
        '}'
      ].join('\n')
    }).appendTo('head');
  };
 
  $(function () {
    $.each(config, function () {
      var self = this;
 
      (new FA.Topic.MarkIcon(self)).init();
    });
  });
}(jQuery));

Como o senhor pode ver no array de configuração:
Código:
var config = [
  { name: 'Resolvido', id  : 4, background: '#8b5', onlyForMod: true },
  { name: 'Em Curso', id  : 1, background: '#ebb537' },
  { name: 'Importante', id: 5, background: '#e3493b', onlyForAdmin: true }
];

Há um botão com uma configuração "onlyForMod". Se estiver marcada como true, somente moderadores e administradores poderão ver o botão daquele objeto.

Há um outro botão, também, configurado como "onlyForAdmin". Se essa configuração estiver marcada como true, somente administradores poderão ver o botão.

É importante frisar que essas configurações como false é como se elas não existissem, logo, só as mantenha no objeto caso elas estiverem como true.

Note que para ambos os casos, a edição daquela postagem ainda deve estar ativa!

o/

Perfeito! Mas eu queria restringir os sub-foruns também, seria possível?
Tipo, determinar os sub-foruns que cada botão vai aparecer.
Obrigado!
JR_Junior

JR_Junior
Nível 5

Masculino
Inscrito dia : 10/05/2012
Mensagens : 46
Pontos Ativos : 79

Ver perfil do usuário http://darkstreet-server.livreforum.com

Atendido / Resolvido Re: Restringindo botões

Mensagem por Luiz em 10.10.17 14:46

Não é possível fazer por subfóruns. Na verdade é, mas não é muito performático.
É possível selecionar por tópicos, mas creio que isso não seja muito viável.
Luiz

Luiz
Principal contribuidor
Principal contribuidor

Masculino
Inscrito dia : 23/04/2016
Mensagens : 6626
Pontos Ativos : 7521

Ver perfil do usuário https://luizfelipe.dev

Atendido / Resolvido Re: Restringindo botões

Mensagem por JR_Junior em 10.10.17 14:56

@Luiz escreveu:Não é possível fazer por subfóruns. Na verdade é, mas não é muito performático.
É possível selecionar por tópicos, mas creio que isso não seja muito viável.

Uma pena, mas limitando por moderador e admin já está ótimo! Brigadão!
JR_Junior

JR_Junior
Nível 5

Masculino
Inscrito dia : 10/05/2012
Mensagens : 46
Pontos Ativos : 79

Ver perfil do usuário http://darkstreet-server.livreforum.com

Atendido / Resolvido Re: Restringindo botões

Mensagem por Luiz em 10.10.17 15:15

Questão marcada como Resolvida ou o Autor solicitou que ela fosse arquivada.
Tópico marcado como Resolvido e movido para Questões resolvidas.
Luiz

Luiz
Principal contribuidor
Principal contribuidor

Masculino
Inscrito dia : 23/04/2016
Mensagens : 6626
Pontos Ativos : 7521

Ver perfil do usuário https://luizfelipe.dev

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


Permissão deste fórum:
Você não pode responder aos tópicos neste fórum