• Gitlab или Bitbucket?

    evilandfox
    @evilandfox
    Javascript, meteor, Qt
    внесу свои 5 копеек)
    оба сервиса хороши. теперь GitLab развился и работает намного шустрее. и да, проекты можно размещать бесплатно.
    лично я использую оба, bitbucket для собственных проектов и экспериментов, а gitlab для фрилансерских проектов. gitlab как по мне чуточку поприятнее в плане интерфейса.
    Ответ написан
    Комментировать
  • Как подключить share-кнопки соцсетей в React?

    evilandfox
    @evilandfox
    Javascript, meteor, Qt
    Фишка в том, что для таких иницилизируемых javascript'ом компонентов надо делать инициализацию в componentDidMont через доступ с помощью ref:
    codepen.io/evilandfox/pen/jAxJxv
    <script type="text/javascript" src="http://vk.com/js/api/share.js?93" charset="windows-1251"></script>
    <script>window.twttr = (function(d, s, id) {
      var js, fjs = d.getElementsByTagName(s)[0],
        t = window.twttr || {};
      if (d.getElementById(id)) return t;
      js = d.createElement(s);
      js.id = id;
      js.src = "https://platform.twitter.com/widgets.js";
      fjs.parentNode.insertBefore(js, fjs);
     
      t._e = [];
      t.ready = function(f) {
        t._e.push(f);
      };
      return t;
    }(document, "script", "twitter-wjs"));</script>
    <div id="main"></div>

    var Component = React.createClass({
      componentDidMount: function(){
        this.refs.vk.innerHTML = VK.Share.button(false, {type: "round", text: "Сохранить"});
        twttr.widgets.createShareButton(
          'https://dev.twitter.com/',
          this.refs.tw,
          {
            text: 'Hello World'
          });
      },
      render: function(){
        return (
          <div>
            <h4>Поделиться:</h4>
            <div ref="vk"></div>
            <div ref="tw"></div>
          </div>
        );
      }
    });
    
    ReactDOM.render(<Component/>, document.getElementById("main"));
    Ответ написан
    Комментировать
  • Открыть текущий div?

    evilandfox
    @evilandfox
    Javascript, meteor, Qt
    Сделал немного по-другому https://jsfiddle.net/d4pb3h42/
    Ответ написан
  • Как нормально отобразить файл архива на кириллице на QuaZIP?

    evilandfox
    @evilandfox Автор вопроса
    Javascript, meteor, Qt
    Случайно получилось решить проблему. Привожу код:
    QTextDecoder *decoder = QTextCodec::codecForName("cp866")->makeDecoder(QTextCodec::IgnoreHeader);
    QString badString = "ѓќ‘Ќ/‘Ў®а\u00ADЁЄЁ \u00AD  ¬®\u00ADв ¦ ®Ў®а㤮ў \u00ADЁп/";
    QString correctString = decoder->toUnicode(badString.toLocal8Bit());
    qDebug() << correctString; //выведет "ГЭСН/Сборники на монтаж оборудования/"

    Не уверен насчет кроссплатформенности

    UPDATE
    Понадобилось больше функционала от библиотеки, в итоге начал использовать сам класс QuaZip. А там проблема решается просто:
    QuaZip *zip = new QuaZip();
    zip->setFileNameCodec("IBM866");
    Ответ написан
  • Как добавлять текст в input в зависимости от выбранного checkbox?

    evilandfox
    @evilandfox
    Javascript, meteor, Qt
    можно например хранить массив значений и добавлять/удалять оттуда эти значения при клике
    var values = [];
    
    $("#workDesign label").on("click", function(){
            var input = $(this).children("input");
            var tag = $(this).text();
            var i = values.indexOf(tag);
            if (input.prop("checked"))  {
                input.parent().addClass("selected");
                if (i==-1) values.push(tag);
                //alert(tag);
            } else {
                if (i>-1) values.splice(i, 1);
                input.parent().removeClass("selected");
            }
            $("#workDesignTags").val(values.join(", "));
        });

    codepen.io/anon/pen/xVpGda

    пришлось проверять каждый раз наличие/отсутствие значения в массиве, т.к. почему-то событие при одном клике вызывается два раза.
    надеюсь понял правильно
    Ответ написан
    1 комментарий
  • Как бы вы решили эту задачу?

    evilandfox
    @evilandfox
    Javascript, meteor, Qt
    Хоть и вопрос задан давно, отвечу на всякий.
    Надо отделять данные от кода.
    Например, можно в том же массиве statuses хранить у каждого элемента третьим элементом текст перед кнопкой, если данный тип кнопки с текстом. Кстати, лучше сделать массив объектов, а не массив массивов.
    Ну а потом передав параметр btn3 (который будет undefined если нет текста перед кнопкой), в компоненте Bbutton уже делать кнопку с текстом или без.
    В общем вот
    Код jsbin
    Ответ написан
    Комментировать
  • Как в meteor правильно вывести все данные из базы в таблицу?

    evilandfox
    @evilandfox
    Javascript, meteor, Qt
    Интересная задачка) Жаль пораньше не увидел.
    Можно ее решить, используя встроенную в Meteor библиотеку Underscore и рекурсию :).
    Пусть имеются такие тестовые данные:

    const _id1 = Items.insert({title: 'Item 1'});
    const _id2 = Items.insert({title: 'Item 2'});
      const _id21 = Items.insert({title: 'Item 2.1', parent: _id2});
      const _id22 = Items.insert({title: 'Item 2.2', parent: _id2});
        const _id221 = Items.insert({title: 'Item 2.2.1', parent: _id22});
        const _id222 = Items.insert({title: 'Item 2.2.1', parent: _id22});
      const _id23 = Items.insert({title: 'Item 2.3', parent: _id2});
    const _id3 = Items.insert({title: 'Item 3'});
      const _id31 = Items.insert({title: 'Item 3.1', parent: _id3});
    const _id4 = Items.insert({title: 'Item 4'});
    const _id5 = Items.insert({title: 'Item 5'});


    Получаем их

    var items = Items.find().fetch();

    Теперь представляем эти данные в виде дерева. Каждый лист дерева - объект со значением title и потомками children. Строим такое дерево через следующую функцию:

    function getAsTree(items) {
      // для корневых элементов ставим _id родителя пустой строкой ''
      var extItems = _.map(items, function(item){
        if ('parent' in item)
          return item;
        else
          return _.extend(item, {parent: ''});
      });
      // данная функция рекурсивно возвращает потомков элемента с заданным _id,
      // которые в свою очередь также содержат потомков и т.д.
      // если же потомка у элемента нет, то в нем {children: []}
      function recBuildTree(_id){
        var result = [];
        return _.map(_.filter(extItems, function(item){
          return item.parent === _id;
        }), function(item){
          return _.extend(item, {
            children: recBuildTree(item._id)
          });
        });
      }
      // определяем корень дерева, который не содержит значения,
      // а его потомки - корневые элементы с {parent: ''}
      var tree = {
        title: '',
        _id: '',
        children: recBuildTree('')
      };
      return tree;
    }


    Теперь создадим темплейт, использующий вспомогательный для отрисовки, затем выведем в нем сгенерированное дерево:

    Template.listView.helpers({
      children: function(){
        return getAsTree(Items.find().fetch()).children;
      }
    });

    <template name="listView">
      <ol>
        {{#each children}}
          {{> _listViewItem}}
        {{/each}}
      </ol>
    </template>

    <template name="_listViewItem">
    <li>
      <div>{{title}}</div>
      {{#if children}}
        <ol>
          {{#each children}}
            {{> _listViewItem}}
          {{/each}}
        </ol>
      {{/if}}
    </li>
    </template>


    Результат:

    ad8001bb04874b2d8e58e2043b1f8fa4.png

    Стоит заметить, что некорневые элементы с несуществующим родителем не будут включены в дерево.
    Ответ написан
    Комментировать
  • Как вызвать функцию после отрисовки всего шаблона (включая внутренние шаблоны) или изменить добавленный тег с помощью Javascript?

    evilandfox
    @evilandfox
    Javascript, meteor, Qt
    Можно использовать хак с Meteor.defer. Переданная в нее функция исполнится после отрисовки DOM:

    Template.creator.onRendered(function(){
      Meteor.defer(function(){
        //Код
      });
    });


    в вашем случае, скорее всего, будет вот так

    Template.creator.onRendered(function(){
      Meteor.defer(function(){
        $('textarea').each(function(){
          $(this).height(this.scrollHeight);
        });
      });
    });
    Ответ написан
    Комментировать