Revision 618

Date:
2016/11/09 15:02:51
Author:
ahitrov
Revision Log:
AJAX status change bug fix.

Files:

Legend:

 
Added
 
Removed
 
Modified
  • utf8/core/comps/contenido/ajax/document_status.html

     
    10 10 $id => undef
    11 11 $class => undef
    12 12 $status => undef
    13 $toggle => undef
    13 14 $params => undef
    14 15
    15 16 </%args>
     
    17 18
    18 19 my %result;
    19 20
    20 if ( $id && $id =~ /^\d+$/ && $class && $class =~ /::/ && defined $status ) {
    21 if ( $id && $id =~ /^\d+$/ && $class && $class =~ /--/ && ($toggle || defined $status) ) {
    22 $class =~ s/-/:/g;
    21 23 my $section = $keeper->get_section_by_id( $s ) if $s;
    22 24 my $document = $keeper->get_document_by_id( $id, class => $class );
    23 25 my %filter;
     
    35 37
    36 38 # стандартная жопка таблицы...
    37 39 push @columns, {attr => '_act_', rusname => 'Действия'};
    38
    39 $document->status( $status );
    40 $document->store;
    41 40
    41 if ( defined $status ) {
    42 $document->status( $status );
    43 $document->store;
    44 } else {
    45 my ($prop) = grep { $_->{attr} eq 'status' } $document->structure;
    46 if ( ref $prop && exists $prop->{cases} && ref $prop->{cases} eq 'ARRAY' && scalar @{$prop->{cases}} == 2 ) {
    47 $document->status( $prop->{cases}[0][0] == $document->status ? $prop->{cases}[1][0] : $prop->{cases}[0][0] );
    48 $document->store;
    49 }
    50 }
    51
    42 52 my $html = $m->scomp('/contenido/components/section_browse_row.msn', no_tr => 1,
    43 53 document => $document, columns => \@columns, section => $section,
    44 54 lookup_elemets => {}, filter => \%filter, params_unsection => $params_unsection, params_unclassed => $params_unclassed
  • utf8/core/comps/contenido/components/section_browse.msn

     
    63 63 return dumped_text;
    64 64 }
    65 65
    66 $(document).ready(function(){
    67 $('.move-up').on('click', function( ev ){
    68 ev.preventDefault();
    69 var $nID = $(this).data('id');
    70 $.ajax({
    71 'url' : '/contenido/ajax/document_move.html',
    72 'data' : { 's' : <% ref $section ? $section->id : 0 %>, 'id' : $nID, 'move' : 'up' },
    73 'dataType' : 'json',
    74 'success' : function( data ){
    75 if ( data.error ) {
    76 alert( data.error );
    77 } else if ( data.before ) {
    78 var $nBefore = data.before;
    79 $('#row-' + $nID).insertBefore('#row-' + $nBefore);
    80 }
    81 }
    82 });
    83 });
    84 $('.move-down').on('click', function( ev ){
    85 ev.preventDefault();
    86 var $nID = $(this).data('id');
    87 $.ajax({
    88 'url' : '/contenido/ajax/document_move.html',
    89 'data' : { 's' : <% ref $section ? $section->id : 0 %>, 'id' : $nID, 'move' : 'down' },
    90 'dataType' : 'json',
    91 'success' : function( data ){
    92 if ( data.error ) {
    93 alert( data.error );
    94 } else if ( data.after ) {
    95 var $nAfter = data.after;
    96 $('#row-' + $nID).insertAfter('#row-' + $nAfter);
    97 }
    98 }
    99 });
    100 });
    66 var oMenus = {
    67 % my $cls_count = scalar keys %document_classes;
    101 68 % foreach my $class ( keys %document_classes ) {
    69 % $cls_count--;
    102 70 % my $class_name = $class;
    103 71 % $class_name =~ s/:/-/g;
    104 72 % my ($prop) = grep { $_->{attr} eq 'status' } $class->new( $keeper )->structure;
     
    114 82 % push @menu, "'$key' : { 'name' : '$name' }";
    115 83 % }
    116 84 % }
    117 $.contextMenu({
    118 selector: '.context-menu-<% $class_name %>',
    119 trigger: 'left',
    120 callback: function(key, options) {
    121 var nID = parseInt($(this).data('id'));
    122 if ( nID != key ) {
    123 $.ajax({
    124 'url' : '/contenido/ajax/document_status.html',
    125 'data' : { 'class' : '<% $class %>', 'id' : nID, 'status' : key, 's' : <% ref $section ? $section->id : 0 %>, 'params' : '<% $params %>' },
    126 'dataType' : 'json',
    127 'success' : function( data ) {
    128 if ( data.error ) {
    129 alert( data.error );
    85 '<% $class_name %>' : { <% join(", ", @menu) %> }<% $cls_count ? ',' : '' %>
    86 % }
    87 % }
    88
    89 }
    90
    91 function set_status_toggle( ev, nID, $class_name ) {
    92 ev.preventDefault();
    93 $.ajax({
    94 'url' : '/contenido/ajax/document_status.html',
    95 'data' : { 'class' : $class_name, 'id' : nID, 'toggle' : 1, 's' : <% ref $section ? $section->id : 0 %>, 'params' : '<% $params %>' },
    96 'dataType' : 'json',
    97 'success' : function( data ) {
    98 if ( data.error ) {
    99 alert( data.error );
    100 }
    101 if ( data.success ) {
    102 $('#row-' + nID).html(data.html);
    103 $('#status-set-'+ nID).on('click', function( ev ) {
    104 set_status_toggle(ev, nID, $class_name)
    105 });
    106 }
    107 }
    108 });
    109 }
    110
    111 function set_status( $selector, $class_name ) {
    112 var oMenu = oMenus[$class_name];
    113 $.contextMenu({
    114 selector: $selector,
    115 trigger: 'left',
    116 callback: function(key, options) {
    117 var nID = parseInt($(this).data('id'));
    118 if ( nID != key ) {
    119 $.ajax({
    120 'url' : '/contenido/ajax/document_status.html',
    121 'data' : { 'class' : $class_name, 'id' : nID, 'status' : key, 's' : <% ref $section ? $section->id : 0 %>, 'params' : '<% $params %>' },
    122 'dataType' : 'json',
    123 'success' : function( data ) {
    124 if ( data.error ) {
    125 alert( data.error );
    126 }
    127 if ( data.success ) {
    128 $('#row-' + nID).html(data.html);
    129 set_status( '#status-set-'+ nID, $class_name);
    130 }
    130 131 }
    131 if ( data.success ) {
    132 $('#row-' + nID).html(data.html);
    133 }
    132 });
    133 }
    134 },
    135 items: oMenu
    136 });
    137 }
    138
    139 $(document).ready(function(){
    140 $('.move-up').on('click', function( ev ){
    141 ev.preventDefault();
    142 var $nID = $(this).data('id');
    143 $.ajax({
    144 'url' : '/contenido/ajax/document_move.html',
    145 'data' : { 's' : <% ref $section ? $section->id : 0 %>, 'id' : $nID, 'move' : 'up' },
    146 'dataType' : 'json',
    147 'success' : function( data ){
    148 if ( data.error ) {
    149 alert( data.error );
    150 } else if ( data.before ) {
    151 var $nBefore = data.before;
    152 $('#row-' + $nID).insertBefore('#row-' + $nBefore);
    134 153 }
    135 });
    136 }
    137 // var m = "clicked: " + key;
    138 // window.console && console.log(m) || alert(m);
    139 },
    140 items: {
    141 <% join(",\n", @menu) %>
    142 }
    143 });
    154 }
    155 });
    156 });
    157
    158 $('.move-down').on('click', function( ev ){
    159 ev.preventDefault();
    160 var $nID = $(this).data('id');
    161 $.ajax({
    162 'url' : '/contenido/ajax/document_move.html',
    163 'data' : { 's' : <% ref $section ? $section->id : 0 %>, 'id' : $nID, 'move' : 'down' },
    164 'dataType' : 'json',
    165 'success' : function( data ){
    166 if ( data.error ) {
    167 alert( data.error );
    168 } else if ( data.after ) {
    169 var $nAfter = data.after;
    170 $('#row-' + $nID).insertAfter('#row-' + $nAfter);
    171 }
    172 }
    173 });
    174 });
    175
    176 % foreach my $class ( keys %document_classes ) {
    177 % my $class_name = $class;
    178 % $class_name =~ s/:/-/g;
    179 % my ($prop) = grep { $_->{attr} eq 'status' } $class->new( $keeper )->structure;
    180 % if ( ref $prop && exists $prop->{cases} && ref $prop->{cases} eq 'ARRAY' ) {
    181 % if ( scalar @{$prop->{cases}} > 2 ) {
    182 set_status( '.context-menu-<% $class_name %>', '<% $class_name %>' );
    183 % } else {
    184 $('.context-menu-<% $class_name %>').on('click', function( ev ) {
    185 var nID = parseInt($(this).data('id'));
    186 set_status_toggle(ev, nID, '<% $class_name %>')
    187 });
    188 % }
    144 189 % }
    145 190 % }
    146 191 });
  • utf8/core/comps/contenido/components/section_browse_row.msn

     
    161 161 src="/contenido/i/actions/delete.gif" width="14" height="17" alt="Удалить документ" align="absmiddle" border="0" hspace="1"></a>\
    162 162 % if ( $document->status != 0 ) {
    163 163 <a href="document.html?deactivate=1&id=<% $document->id %>&class=<% $document->class %><% $params_unclassed ? '&'.$params_unclassed : '' %>"
    164 class="context-menu-<% $class_name %>" title="Статус документа" data-id="<% $document->id %>"><img
    164 class="context-menu-<% $class_name %>" id="status-set-<% $document->id %>" title="Статус документа" data-id="<% $document->id %>"><img
    165 165 src="/contenido/i/actions/activate.gif" width="14" height="17" alt="Документ активен" align="absmiddle" border="0" hspace="1"></a>\
    166 166 % } else {
    167 167 <a href="document.html?activate=1&id=<% $document->id %>&class=<% $document->class %><% $params_unclassed ? '&'.$params_unclassed : '' %>"
    168 class="context-menu-<% $class_name %>" title="Статус документа" data-id="<% $document->id %>"><img
    168 class="context-menu-<% $class_name %>" id="status-set-<% $document->id %>" title="Статус документа" data-id="<% $document->id %>"><img
    169 169 src="/contenido/i/actions/deactivate.gif" width="14" height="17" alt="Документ не активен" align="absmiddle" border="0" hspace="1"></a>\
    170 170 % }
    171 171 <br>\

Небольшая справка по веткам

cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.

koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.

utf8 – актуальная ветка, заточенная под UTF-8.

Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.