card 1.101.3 → 1.101.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/VERSION +1 -1
 - data/config/initializers/02_patches/active_record.rb +1 -1
 - data/config/locales/en.yml +155 -378
 - data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +1 -1
 - data/lib/card.rb +15 -2
 - data/lib/card/auth.rb +5 -2
 - data/lib/card/auth/current.rb +39 -100
 - data/lib/card/auth/proxy.rb +36 -16
 - data/lib/card/auth/token.rb +6 -0
 - data/lib/card/cache/all.rb +83 -0
 - data/lib/card/cache/card_class.rb +41 -0
 - data/lib/card/cache/persistent.rb +3 -34
 - data/lib/card/cache/persistent_class.rb +28 -0
 - data/lib/card/codename.rb +1 -1
 - data/lib/card/content.rb +16 -2
 - data/lib/card/content/all.rb +59 -0
 - data/lib/card/director/act_direction.rb +4 -0
 - data/lib/card/director/all.rb +61 -0
 - data/lib/card/director/card_class.rb +18 -0
 - data/lib/card/director/phases.rb +0 -1
 - data/lib/card/dirty.rb +13 -3
 - data/lib/card/env/success.rb +14 -14
 - data/lib/card/env/success/target.rb +9 -11
 - data/lib/card/error.rb +1 -1
 - data/lib/card/fetch/all.rb +32 -0
 - data/lib/card/fetch/card_class.rb +147 -0
 - data/lib/card/format.rb +1 -1
 - data/lib/card/format/error.rb +3 -3
 - data/lib/card/format/nest.rb +1 -1
 - data/lib/card/format/nest/fetch.rb +1 -1
 - data/lib/card/lexicon.rb +2 -2
 - data/lib/card/name/all.rb +8 -0
 - data/lib/card/name/all/descendants.rb +6 -3
 - data/lib/card/name/card_class.rb +26 -0
 - data/lib/card/reference/all.rb +131 -0
 - data/lib/card/rule/all.rb +75 -0
 - data/lib/card/set/event/all.rb +95 -0
 - data/lib/card/set/event/skip_and_trigger.rb +89 -0
 - data/lib/card/set/pattern/all.rb +63 -0
 - data/lib/card/subcards/all.rb +103 -0
 - data/lib/cardio/migration/import.rb +1 -1
 - data/lib/cardio/utils.rb +5 -3
 - data/mod/admin/set/self/admin_info.rb +3 -5
 - data/mod/admin/set/self/trash.rb +2 -2
 - data/mod/core/set/all/autoname.rb +17 -0
 - data/mod/core/set/all/codename.rb +2 -2
 - data/mod/core/set/all/content.rb +52 -97
 - data/mod/core/set/all/name_events.rb +69 -58
 - data/mod/core/set/all/reference_events.rb +67 -0
 - data/mod/core/set/all/states.rb +2 -2
 - data/mod/core/set/all/subcards.rb +0 -100
 - data/mod/core/set/all/trash.rb +11 -13
 - data/mod/core/set/all/type.rb +7 -9
 - data/mod/core/set/all/utils.rb +3 -0
 - data/mod/core/set/type/cardtype.rb +3 -3
 - data/mod/core/set_pattern/06_rule.rb +1 -1
 - data/mod/core/spec/set/all/{rules2_spec.rb → clean_me_spec.rb} +0 -0
 - data/mod/core/spec/set/all/name_events_spec.rb +204 -0
 - metadata +30 -37
 - data/lib/card/mod_inflector.rb +0 -16
 - data/lib/card/name/all/class_methods.rb +0 -28
 - data/mod/core/set/all/actify.rb +0 -68
 - data/mod/core/set/all/cache.rb +0 -109
 - data/mod/core/set/all/event_conditions.rb +0 -172
 - data/mod/core/set/all/fetch.rb +0 -122
 - data/mod/core/set/all/fetch_helper.rb +0 -35
 - data/mod/core/set/all/i18n.rb +0 -9
 - data/mod/core/set/all/pattern.rb +0 -54
 - data/mod/core/set/all/references.rb +0 -191
 - data/mod/core/set/all/rename.rb +0 -33
 - data/mod/core/set/all/rules.rb +0 -81
 - data/mod/core/spec/set/all/actify_spec.rb +0 -58
 - data/mod/core/spec/set/all/content_spec.rb +0 -15
 - data/mod/core/spec/set/all/event_conditions_spec.rb +0 -217
 - data/mod/core/spec/set/all/fetch_helper_spec.rb +0 -65
 - data/mod/core/spec/set/all/fetch_spec.rb +0 -338
 - data/mod/core/spec/set/all/i18n_spec.rb +0 -17
 - data/mod/core/spec/set/all/pattern_spec.rb +0 -101
 - data/mod/core/spec/set/all/permissions/reader_rules_spec.rb +0 -166
 - data/mod/core/spec/set/all/references_spec.rb +0 -62
 - data/mod/core/spec/set/all/rename_spec.rb +0 -189
 - data/mod/core/spec/set/all/rules_spec.rb +0 -100
 - data/mod/core/spec/set/all/subcards_spec.rb +0 -102
 
| 
         @@ -19,11 +19,11 @@ private 
     | 
|
| 
       19 
19 
     | 
    
         
             
            def validate_codename_permission
         
     | 
| 
       20 
20 
     | 
    
         
             
              return if Auth.always_ok? || Auth.as_id == creator_id
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
              errors.add :codename,  
     | 
| 
      
 22 
     | 
    
         
            +
              errors.add :codename, t(:core_only_admins_codename)
         
     | 
| 
       23 
23 
     | 
    
         
             
            end
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
            def validate_codename_uniqueness
         
     | 
| 
       26 
26 
     | 
    
         
             
              return (self.codename = nil) if codename.blank?
         
     | 
| 
       27 
27 
     | 
    
         
             
              return if errors.present? || !Card.find_by_codename(codename)
         
     | 
| 
       28 
     | 
    
         
            -
              errors.add :codename,  
     | 
| 
      
 28 
     | 
    
         
            +
              errors.add :codename, t(:core_error_code_in_use, codename: codename)
         
     | 
| 
       29 
29 
     | 
    
         
             
            end
         
     | 
    
        data/mod/core/set/all/content.rb
    CHANGED
    
    | 
         @@ -1,30 +1,67 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
       2 
     | 
    
         
            -
              self.db_content =  
     | 
| 
      
 1 
     | 
    
         
            +
            event :set_content, :store, on: :save do
         
     | 
| 
      
 2 
     | 
    
         
            +
              self.db_content = prepare_db_content
         
     | 
| 
      
 3 
     | 
    
         
            +
              @selected_action_id = @selected_content = nil
         
     | 
| 
      
 4 
     | 
    
         
            +
              clear_drafts
         
     | 
| 
      
 5 
     | 
    
         
            +
            end
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            event :save_draft, :store, on: :update, when: :draft? do
         
     | 
| 
      
 8 
     | 
    
         
            +
              save_content_draft content
         
     | 
| 
      
 9 
     | 
    
         
            +
              abort :success
         
     | 
| 
      
 10 
     | 
    
         
            +
            end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            event :set_default_content,
         
     | 
| 
      
 13 
     | 
    
         
            +
                  :prepare_to_validate,
         
     | 
| 
      
 14 
     | 
    
         
            +
                  on: :create, when: :use_default_content? do
         
     | 
| 
      
 15 
     | 
    
         
            +
              self.db_content = template.db_content
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            def draft?
         
     | 
| 
      
 19 
     | 
    
         
            +
              Env.params["draft"] == "true"
         
     | 
| 
      
 20 
     | 
    
         
            +
            end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            def clean_html?
         
     | 
| 
      
 23 
     | 
    
         
            +
              true
         
     | 
| 
      
 24 
     | 
    
         
            +
            end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            def use_default_content?
         
     | 
| 
      
 27 
     | 
    
         
            +
              !db_content_changed? && template && template.db_content.present?
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            def unfilled?
         
     | 
| 
      
 31 
     | 
    
         
            +
              blank_content? && blank_comment? && !subcards?
         
     | 
| 
       3 
32 
     | 
    
         
             
            end
         
     | 
| 
       4 
33 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
            def  
     | 
| 
       6 
     | 
    
         
            -
               
     | 
| 
      
 34 
     | 
    
         
            +
            def blank_comment?
         
     | 
| 
      
 35 
     | 
    
         
            +
              comment.blank? || comment.strip.blank?
         
     | 
| 
       7 
36 
     | 
    
         
             
            end
         
     | 
| 
       8 
     | 
    
         
            -
            alias raw_content content #DEPRECATED!
         
     | 
| 
       9 
37 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
            def  
     | 
| 
       11 
     | 
    
         
            -
               
     | 
| 
      
 38 
     | 
    
         
            +
            def prepare_db_content
         
     | 
| 
      
 39 
     | 
    
         
            +
              cont = standard_db_content || "" # necessary?
         
     | 
| 
      
 40 
     | 
    
         
            +
              clean_html? ? Card::Content.clean!(cont) : cont
         
     | 
| 
       12 
41 
     | 
    
         
             
            end
         
     | 
| 
       13 
42 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
            def  
     | 
| 
       15 
     | 
    
         
            -
               
     | 
| 
      
 43 
     | 
    
         
            +
            def standard_db_content
         
     | 
| 
      
 44 
     | 
    
         
            +
              if structure
         
     | 
| 
      
 45 
     | 
    
         
            +
                # do not override db_content with content from structure
         
     | 
| 
      
 46 
     | 
    
         
            +
                db_content
         
     | 
| 
      
 47 
     | 
    
         
            +
              else
         
     | 
| 
      
 48 
     | 
    
         
            +
                standard_content
         
     | 
| 
      
 49 
     | 
    
         
            +
              end
         
     | 
| 
       16 
50 
     | 
    
         
             
            end
         
     | 
| 
       17 
51 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
      
 52 
     | 
    
         
            +
            # seems like this should be moved to format so we can fall back on title
         
     | 
| 
      
 53 
     | 
    
         
            +
            # rather than name. (In fact, name, title, AND label is a bit much.
         
     | 
| 
      
 54 
     | 
    
         
            +
            # Trim to 2?)
         
     | 
| 
      
 55 
     | 
    
         
            +
            def label
         
     | 
| 
      
 56 
     | 
    
         
            +
              name
         
     | 
| 
       20 
57 
     | 
    
         
             
            end
         
     | 
| 
       21 
58 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
            def  
     | 
| 
       23 
     | 
    
         
            -
               
     | 
| 
      
 59 
     | 
    
         
            +
            def creator
         
     | 
| 
      
 60 
     | 
    
         
            +
              Card[creator_id]
         
     | 
| 
       24 
61 
     | 
    
         
             
            end
         
     | 
| 
       25 
62 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
            def  
     | 
| 
       27 
     | 
    
         
            -
               
     | 
| 
      
 63 
     | 
    
         
            +
            def updater
         
     | 
| 
      
 64 
     | 
    
         
            +
              Card[updater_id]
         
     | 
| 
       28 
65 
     | 
    
         
             
            end
         
     | 
| 
       29 
66 
     | 
    
         | 
| 
       30 
67 
     | 
    
         
             
            format do
         
     | 
| 
         @@ -94,85 +131,3 @@ format :html do 
     | 
|
| 
       94 
131 
     | 
    
         
             
                hidden_field :content, class: "d0-card-content"
         
     | 
| 
       95 
132 
     | 
    
         
             
              end
         
     | 
| 
       96 
133 
     | 
    
         
             
            end
         
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
       98 
     | 
    
         
            -
            # seems like this should be moved to format so we can fall back on title
         
     | 
| 
       99 
     | 
    
         
            -
            # rather than name. (In fact, name, title, AND label is a bit much.
         
     | 
| 
       100 
     | 
    
         
            -
            # Trim to 2?)
         
     | 
| 
       101 
     | 
    
         
            -
            def label
         
     | 
| 
       102 
     | 
    
         
            -
              name
         
     | 
| 
       103 
     | 
    
         
            -
            end
         
     | 
| 
       104 
     | 
    
         
            -
             
     | 
| 
       105 
     | 
    
         
            -
            def creator
         
     | 
| 
       106 
     | 
    
         
            -
              Card[creator_id]
         
     | 
| 
       107 
     | 
    
         
            -
            end
         
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
       109 
     | 
    
         
            -
            def updater
         
     | 
| 
       110 
     | 
    
         
            -
              Card[updater_id]
         
     | 
| 
       111 
     | 
    
         
            -
            end
         
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
       113 
     | 
    
         
            -
            def save_content_draft _content
         
     | 
| 
       114 
     | 
    
         
            -
              clear_drafts
         
     | 
| 
       115 
     | 
    
         
            -
            end
         
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
       117 
     | 
    
         
            -
            def clear_drafts
         
     | 
| 
       118 
     | 
    
         
            -
              drafts.created_by(Card::Auth.current_id).each(&:delete)
         
     | 
| 
       119 
     | 
    
         
            -
            end
         
     | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
     | 
    
         
            -
            def last_draft_content
         
     | 
| 
       122 
     | 
    
         
            -
              drafts.last.card_changes.last.value
         
     | 
| 
       123 
     | 
    
         
            -
            end
         
     | 
| 
       124 
     | 
    
         
            -
             
     | 
| 
       125 
     | 
    
         
            -
            event :set_content, :store, on: :save do
         
     | 
| 
       126 
     | 
    
         
            -
              self.db_content = prepare_db_content
         
     | 
| 
       127 
     | 
    
         
            -
              @selected_action_id = @selected_content = nil
         
     | 
| 
       128 
     | 
    
         
            -
              clear_drafts
         
     | 
| 
       129 
     | 
    
         
            -
            end
         
     | 
| 
       130 
     | 
    
         
            -
             
     | 
| 
       131 
     | 
    
         
            -
            event :save_draft, :store, on: :update, when: :draft? do
         
     | 
| 
       132 
     | 
    
         
            -
              save_content_draft content
         
     | 
| 
       133 
     | 
    
         
            -
              abort :success
         
     | 
| 
       134 
     | 
    
         
            -
            end
         
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
     | 
    
         
            -
            event :set_default_content,
         
     | 
| 
       137 
     | 
    
         
            -
                  :prepare_to_validate,
         
     | 
| 
       138 
     | 
    
         
            -
                  on: :create, when: :use_default_content? do
         
     | 
| 
       139 
     | 
    
         
            -
              self.db_content = template.db_content
         
     | 
| 
       140 
     | 
    
         
            -
            end
         
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
            def draft?
         
     | 
| 
       143 
     | 
    
         
            -
              Env.params["draft"] == "true"
         
     | 
| 
       144 
     | 
    
         
            -
            end
         
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
       146 
     | 
    
         
            -
            def prepare_db_content
         
     | 
| 
       147 
     | 
    
         
            -
              cont = standard_db_content || "" # necessary?
         
     | 
| 
       148 
     | 
    
         
            -
              clean_html? ? Card::Content.clean!(cont) : cont
         
     | 
| 
       149 
     | 
    
         
            -
            end
         
     | 
| 
       150 
     | 
    
         
            -
             
     | 
| 
       151 
     | 
    
         
            -
            def standard_db_content
         
     | 
| 
       152 
     | 
    
         
            -
              if structure
         
     | 
| 
       153 
     | 
    
         
            -
                # do not override db_content with content from structure
         
     | 
| 
       154 
     | 
    
         
            -
                db_content
         
     | 
| 
       155 
     | 
    
         
            -
              else
         
     | 
| 
       156 
     | 
    
         
            -
                standard_content
         
     | 
| 
       157 
     | 
    
         
            -
              end
         
     | 
| 
       158 
     | 
    
         
            -
            end
         
     | 
| 
       159 
     | 
    
         
            -
             
     | 
| 
       160 
     | 
    
         
            -
            def clean_html?
         
     | 
| 
       161 
     | 
    
         
            -
              true
         
     | 
| 
       162 
     | 
    
         
            -
            end
         
     | 
| 
       163 
     | 
    
         
            -
             
     | 
| 
       164 
     | 
    
         
            -
            def use_default_content?
         
     | 
| 
       165 
     | 
    
         
            -
              !db_content_changed? && template && template.db_content.present?
         
     | 
| 
       166 
     | 
    
         
            -
            end
         
     | 
| 
       167 
     | 
    
         
            -
             
     | 
| 
       168 
     | 
    
         
            -
            def unfilled?
         
     | 
| 
       169 
     | 
    
         
            -
              blank_content? && blank_comment? && !subcards?
         
     | 
| 
       170 
     | 
    
         
            -
            end
         
     | 
| 
       171 
     | 
    
         
            -
             
     | 
| 
       172 
     | 
    
         
            -
            def blank_content?
         
     | 
| 
       173 
     | 
    
         
            -
              content.blank? || content.strip.blank?
         
     | 
| 
       174 
     | 
    
         
            -
            end
         
     | 
| 
       175 
     | 
    
         
            -
             
     | 
| 
       176 
     | 
    
         
            -
            def blank_comment?
         
     | 
| 
       177 
     | 
    
         
            -
              comment.blank? || comment.strip.blank?
         
     | 
| 
       178 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -7,73 +7,58 @@ event :validate_name, :validate, on: :save, changed: :name, when: :no_autoname? 
     | 
|
| 
       7 
7 
     | 
    
         
             
              validate_uniqueness_of_name
         
     | 
| 
       8 
8 
     | 
    
         
             
            end
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
      
 10 
     | 
    
         
            +
            # called by validate_name
         
     | 
| 
       10 
11 
     | 
    
         
             
            event :validate_uniqueness_of_name, skip: :allowed do
         
     | 
| 
       11 
     | 
    
         
            -
              # validate uniqueness of name
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
12 
     | 
    
         
             
              return unless (existing_id = Card::Lexicon.id key) && existing_id != id
         
     | 
| 
       14 
13 
     | 
    
         
             
              # The above is a fast check but cannot detect if card is in trash
         
     | 
| 
       15 
14 
     | 
    
         | 
| 
       16 
15 
     | 
    
         
             
              # TODO: perform the following as a remote-only fetch (not yet supported)
         
     | 
| 
       17 
16 
     | 
    
         
             
              return unless (existing_card = Card.where(id: existing_id, trash: false).take)
         
     | 
| 
       18 
17 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
              errors.add :name,  
     | 
| 
      
 18 
     | 
    
         
            +
              errors.add :name, t(:core_error_name_exists, name: existing_card.name)
         
     | 
| 
       20 
19 
     | 
    
         
             
            end
         
     | 
| 
       21 
20 
     | 
    
         | 
| 
      
 21 
     | 
    
         
            +
            # called by validate_name
         
     | 
| 
       22 
22 
     | 
    
         
             
            event :validate_legality_of_name do
         
     | 
| 
       23 
23 
     | 
    
         
             
              if name.length > 255
         
     | 
| 
       24 
     | 
    
         
            -
                errors.add :name,  
     | 
| 
      
 24 
     | 
    
         
            +
                errors.add :name, t(:core_error_too_long, length: name.length)
         
     | 
| 
       25 
25 
     | 
    
         
             
              elsif name.blank?
         
     | 
| 
       26 
     | 
    
         
            -
                errors.add :name,  
     | 
| 
      
 26 
     | 
    
         
            +
                errors.add :name, t(:core_error_blank_name)
         
     | 
| 
       27 
27 
     | 
    
         
             
              elsif name_incomplete?
         
     | 
| 
       28 
     | 
    
         
            -
                errors.add :name,  
     | 
| 
      
 28 
     | 
    
         
            +
                errors.add :name, t(:core_is_incomplete)
         
     | 
| 
       29 
29 
     | 
    
         
             
              elsif !name.valid?
         
     | 
| 
       30 
     | 
    
         
            -
                errors.add :name,  
     | 
| 
      
 30 
     | 
    
         
            +
                errors.add :name, t(:core_error_banned_characters,
         
     | 
| 
      
 31 
     | 
    
         
            +
                                    banned: Card::Name.banned_array * " ")
         
     | 
| 
       31 
32 
     | 
    
         
             
              elsif changing_existing_tag_to_junction?
         
     | 
| 
       32 
     | 
    
         
            -
                errors.add :name,  
     | 
| 
      
 33 
     | 
    
         
            +
                errors.add :name, t(:core_error_name_tag, name: name)
         
     | 
| 
       33 
34 
     | 
    
         
             
              end
         
     | 
| 
       34 
35 
     | 
    
         
             
            end
         
     | 
| 
       35 
36 
     | 
    
         | 
| 
       36 
37 
     | 
    
         
             
            event :validate_key, after: :validate_name, on: :save, when: :no_autoname? do
         
     | 
| 
       37 
38 
     | 
    
         
             
              if key.empty?
         
     | 
| 
       38 
     | 
    
         
            -
                errors.add :key,  
     | 
| 
      
 39 
     | 
    
         
            +
                errors.add :key, t(:core_error_blank_key) if errors.empty?
         
     | 
| 
       39 
40 
     | 
    
         
             
              elsif key != name.key
         
     | 
| 
       40 
     | 
    
         
            -
                errors.add :key,  
     | 
| 
      
 41 
     | 
    
         
            +
                errors.add :key, t(:core_error_wrong_key, key: key, name: name)
         
     | 
| 
       41 
42 
     | 
    
         
             
              end
         
     | 
| 
       42 
43 
     | 
    
         
             
            end
         
     | 
| 
       43 
44 
     | 
    
         | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
               
     | 
| 
       48 
     | 
    
         
            -
               
     | 
| 
       49 
     | 
    
         
            -
              autoname_card.update_column :db_content, name
         
     | 
| 
       50 
     | 
    
         
            -
              autoname_card.expire
         
     | 
| 
       51 
     | 
    
         
            -
              pull_from_trash!
         
     | 
| 
       52 
     | 
    
         
            -
              Card.write_to_soft_cache self
         
     | 
| 
      
 45 
     | 
    
         
            +
            event :validate_renaming, :validate, on: :update, changed: :name, skip: :allowed do
         
     | 
| 
      
 46 
     | 
    
         
            +
              return if name_before_act&.to_name == name # just changing to new variant
         
     | 
| 
      
 47 
     | 
    
         
            +
              errors.add :content, t(:core_cannot_change_content) if content_is_changing?
         
     | 
| 
      
 48 
     | 
    
         
            +
              errors.add :type, t(:core_cannot_change_type) if type_is_changing?
         
     | 
| 
      
 49 
     | 
    
         
            +
              detect_illegal_compound_names
         
     | 
| 
       53 
50 
     | 
    
         
             
            end
         
     | 
| 
       54 
51 
     | 
    
         | 
| 
      
 52 
     | 
    
         
            +
            # STAGE: store
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
       55 
54 
     | 
    
         
             
            event :expire_old_name, :store, changed: :name, on: :update do
         
     | 
| 
       56 
55 
     | 
    
         
             
              Director.expirees << name_before_act
         
     | 
| 
       57 
56 
     | 
    
         
             
            end
         
     | 
| 
       58 
57 
     | 
    
         | 
| 
       59 
     | 
    
         
            -
            event : 
     | 
| 
       60 
     | 
    
         
            -
              Card 
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       63 
     | 
    
         
            -
            event :update_lexicon_on_rename, :finalize, changed: :name, on: :update do
         
     | 
| 
       64 
     | 
    
         
            -
              Card::Lexicon.update self
         
     | 
| 
       65 
     | 
    
         
            -
            end
         
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
            def lex
         
     | 
| 
       68 
     | 
    
         
            -
              simple? ? name : [left_id, right_id]
         
     | 
| 
       69 
     | 
    
         
            -
            end
         
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
            def old_lex
         
     | 
| 
       72 
     | 
    
         
            -
              if (old_left_id = left_id_before_act)
         
     | 
| 
       73 
     | 
    
         
            -
                [old_left_id, right_id_before_act]
         
     | 
| 
       74 
     | 
    
         
            -
              else
         
     | 
| 
       75 
     | 
    
         
            -
                name_before_act
         
     | 
| 
       76 
     | 
    
         
            -
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
            event :rename_in_trash, after: :expire_old_name, on: :update do
         
     | 
| 
      
 59 
     | 
    
         
            +
              existing_card = Card.find_by_key_and_trash name.key, true
         
     | 
| 
      
 60 
     | 
    
         
            +
              return if !existing_card || existing_card == self
         
     | 
| 
      
 61 
     | 
    
         
            +
              existing_card.rename_as_trash_obstacle
         
     | 
| 
       77 
62 
     | 
    
         
             
            end
         
     | 
| 
       78 
63 
     | 
    
         | 
| 
       79 
64 
     | 
    
         
             
            event :prepare_left_and_right, :store, changed: :name, on: :save do
         
     | 
| 
         @@ -82,42 +67,47 @@ event :prepare_left_and_right, :store, changed: :name, on: :save do 
     | 
|
| 
       82 
67 
     | 
    
         
             
              prepare_side :right
         
     | 
| 
       83 
68 
     | 
    
         
             
            end
         
     | 
| 
       84 
69 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
               
     | 
| 
       87 
     | 
    
         
            -
               
     | 
| 
       88 
     | 
    
         
            -
              prepare_obstructed_side(side, side_id, sidename) ||
         
     | 
| 
       89 
     | 
    
         
            -
                prepare_new_side(side, side_id, sidename)
         
     | 
| 
      
 70 
     | 
    
         
            +
            event :update_lexicon, :finalize, changed: :name, on: :save do
         
     | 
| 
      
 71 
     | 
    
         
            +
              lexicon_action = @action == :create ? :add : :update
         
     | 
| 
      
 72 
     | 
    
         
            +
              Card::Lexicon.send lexicon_action, self
         
     | 
| 
       90 
73 
     | 
    
         
             
            end
         
     | 
| 
       91 
74 
     | 
    
         | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
       93 
     | 
    
         
            -
               
     | 
| 
      
 75 
     | 
    
         
            +
            event :cascade_name_changes, :finalize, on: :update, changed: :name do
         
     | 
| 
      
 76 
     | 
    
         
            +
              each_descendant { |d| d.rename_as_descendant update_referers }
         
     | 
| 
      
 77 
     | 
    
         
            +
            end
         
     | 
| 
       94 
78 
     | 
    
         | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
       96 
     | 
    
         
            -
             
     | 
| 
      
 79 
     | 
    
         
            +
            protected
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
            def rename_as_trash_obstacle
         
     | 
| 
      
 82 
     | 
    
         
            +
              self.name = name + "*trash"
         
     | 
| 
      
 83 
     | 
    
         
            +
              rename_in_trash_without_callbacks
         
     | 
| 
      
 84 
     | 
    
         
            +
              save!
         
     | 
| 
       97 
85 
     | 
    
         
             
            end
         
     | 
| 
       98 
86 
     | 
    
         | 
| 
       99 
     | 
    
         
            -
            def  
     | 
| 
       100 
     | 
    
         
            -
               
     | 
| 
       101 
     | 
    
         
            -
               
     | 
| 
       102 
     | 
    
         
            -
               
     | 
| 
       103 
     | 
    
         
            -
               
     | 
| 
      
 87 
     | 
    
         
            +
            def rename_as_descendant referers=true
         
     | 
| 
      
 88 
     | 
    
         
            +
              self.action = :update
         
     | 
| 
      
 89 
     | 
    
         
            +
              referers ? update_referers : update_referer_references_out
         
     | 
| 
      
 90 
     | 
    
         
            +
              refresh_references_in
         
     | 
| 
      
 91 
     | 
    
         
            +
              refresh_references_out
         
     | 
| 
      
 92 
     | 
    
         
            +
              expire
         
     | 
| 
      
 93 
     | 
    
         
            +
              Card::Lexicon.update self
         
     | 
| 
       104 
94 
     | 
    
         
             
            end
         
     | 
| 
       105 
95 
     | 
    
         | 
| 
      
 96 
     | 
    
         
            +
            private
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
       106 
98 
     | 
    
         
             
            def name_incomplete?
         
     | 
| 
       107 
99 
     | 
    
         
             
              name.parts.include?("") && !superleft&.autoname?
         
     | 
| 
       108 
100 
     | 
    
         
             
            end
         
     | 
| 
       109 
101 
     | 
    
         | 
| 
       110 
     | 
    
         
            -
            def  
     | 
| 
       111 
     | 
    
         
            -
               
     | 
| 
      
 102 
     | 
    
         
            +
            def changed_from_simple_to_compound?
         
     | 
| 
      
 103 
     | 
    
         
            +
              name.compound? && name_before_act.to_name.simple?
         
     | 
| 
       112 
104 
     | 
    
         
             
            end
         
     | 
| 
       113 
105 
     | 
    
         | 
| 
       114 
     | 
    
         
            -
            def  
     | 
| 
       115 
     | 
    
         
            -
               
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
      
 106 
     | 
    
         
            +
            def detect_illegal_compound_names
         
     | 
| 
      
 107 
     | 
    
         
            +
              return unless changed_from_simple_to_compound? && child_ids(:right).present?
         
     | 
| 
      
 108 
     | 
    
         
            +
              errors.add :name, "illegal name change; existing names end in +#{name_before_act}"
         
     | 
| 
       117 
109 
     | 
    
         
             
            end
         
     | 
| 
       118 
110 
     | 
    
         | 
| 
       119 
     | 
    
         
            -
            private
         
     | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
111 
     | 
    
         
             
            def changing_existing_tag_to_junction?
         
     | 
| 
       122 
112 
     | 
    
         
             
              return false unless changing_name_to_junction?
         
     | 
| 
       123 
113 
     | 
    
         
             
              name_in_use_as_tag?
         
     | 
| 
         @@ -143,3 +133,24 @@ def clear_name name 
     | 
|
| 
       143 
133 
     | 
    
         
             
              Card::Lexicon.cache.reset # probably overkill, but this for an edge case...
         
     | 
| 
       144 
134 
     | 
    
         
             
              # Card::Lexicon.delete id, key
         
     | 
| 
       145 
135 
     | 
    
         
             
            end
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
      
 137 
     | 
    
         
            +
            def prepare_side side
         
     | 
| 
      
 138 
     | 
    
         
            +
              side_id = send "#{side}_id"
         
     | 
| 
      
 139 
     | 
    
         
            +
              sidename = name.send "#{side}_name"
         
     | 
| 
      
 140 
     | 
    
         
            +
              prepare_obstructed_side(side, side_id, sidename) ||
         
     | 
| 
      
 141 
     | 
    
         
            +
                prepare_new_side(side, side_id, sidename)
         
     | 
| 
      
 142 
     | 
    
         
            +
            end
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
      
 144 
     | 
    
         
            +
            def prepare_new_side side, side_id, sidename
         
     | 
| 
      
 145 
     | 
    
         
            +
              return unless side_id == -1 || !Card[side_id]&.real?
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
              sidecard = Director.card(sidename) || add_subcard(sidename)
         
     | 
| 
      
 148 
     | 
    
         
            +
              send "#{side}_id=", sidecard
         
     | 
| 
      
 149 
     | 
    
         
            +
            end
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
            def prepare_obstructed_side side, side_id, sidename
         
     | 
| 
      
 152 
     | 
    
         
            +
              return unless side_id && side_id == id
         
     | 
| 
      
 153 
     | 
    
         
            +
              clear_name sidename
         
     | 
| 
      
 154 
     | 
    
         
            +
              send "#{side}_id=", add_subcard(sidename)
         
     | 
| 
      
 155 
     | 
    
         
            +
              true
         
     | 
| 
      
 156 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,67 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # test for updating referer content
         
     | 
| 
      
 2 
     | 
    
         
            +
            event :prepare_referer_update, :validate, on: :update, changed: :name do
         
     | 
| 
      
 3 
     | 
    
         
            +
              self.update_referers = ![nil, false, "false"].member?(update_referers)
         
     | 
| 
      
 4 
     | 
    
         
            +
            end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            # on rename, update names in cards that refer to self by name (as directed)
         
     | 
| 
      
 7 
     | 
    
         
            +
            event :update_referer_content, :finalize, on: :update, when: :update_referers do
         
     | 
| 
      
 8 
     | 
    
         
            +
              referers.each do |card|
         
     | 
| 
      
 9 
     | 
    
         
            +
                next if card.structure
         
     | 
| 
      
 10 
     | 
    
         
            +
                card.skip_event! :validate_renaming, :check_permissions
         
     | 
| 
      
 11 
     | 
    
         
            +
                card.content = card.replace_references name_before_act, name
         
     | 
| 
      
 12 
     | 
    
         
            +
                attach_subcard card
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
            end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            # on rename, when NOT updating referer content, update references to ensure
         
     | 
| 
      
 17 
     | 
    
         
            +
            # that partial references are correctly tracked
         
     | 
| 
      
 18 
     | 
    
         
            +
            # eg.  A links to X+Y.  if X+Y is renamed and we're not updating the link in A,
         
     | 
| 
      
 19 
     | 
    
         
            +
            # then we need to be sure that A has a partial reference
         
     | 
| 
      
 20 
     | 
    
         
            +
            event :update_referer_references_out, :finalize,
         
     | 
| 
      
 21 
     | 
    
         
            +
                  changed: :name, on: :update, when: :not_update_referers do
         
     | 
| 
      
 22 
     | 
    
         
            +
              referers.map(&:update_references_out)
         
     | 
| 
      
 23 
     | 
    
         
            +
            end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            # when name changes, update references to card
         
     | 
| 
      
 26 
     | 
    
         
            +
            event :refresh_references_in, :finalize, changed: :name, on: :save do
         
     | 
| 
      
 27 
     | 
    
         
            +
              Reference.unmap_referees id if action == :update && !update_referers
         
     | 
| 
      
 28 
     | 
    
         
            +
              Reference.map_referees key, id
         
     | 
| 
      
 29 
     | 
    
         
            +
            end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            # when content changes, update references to other cards
         
     | 
| 
      
 32 
     | 
    
         
            +
            event :refresh_references_out, :finalize, on: :save, changed: :content do
         
     | 
| 
      
 33 
     | 
    
         
            +
              update_references_out
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            # clean up reference table when card is deleted
         
     | 
| 
      
 37 
     | 
    
         
            +
            event :clear_references, :finalize, on: :delete do
         
     | 
| 
      
 38 
     | 
    
         
            +
              delete_references_out
         
     | 
| 
      
 39 
     | 
    
         
            +
              Reference.unmap_referees id
         
     | 
| 
      
 40 
     | 
    
         
            +
            end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            # replace references in card content
         
     | 
| 
      
 43 
     | 
    
         
            +
            def replace_references old_name, new_name
         
     | 
| 
      
 44 
     | 
    
         
            +
              cont = content_object
         
     | 
| 
      
 45 
     | 
    
         
            +
              cont.find_chunks(:Reference).each do |chunk|
         
     | 
| 
      
 46 
     | 
    
         
            +
                next unless replace_reference chunk, old_name, new_name
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
              cont.to_s
         
     | 
| 
      
 49 
     | 
    
         
            +
            end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
            protected
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            def not_update_referers
         
     | 
| 
      
 54 
     | 
    
         
            +
              !update_referers
         
     | 
| 
      
 55 
     | 
    
         
            +
            end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
            private
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            def replace_reference chunk, old_name, new_name
         
     | 
| 
      
 60 
     | 
    
         
            +
              return unless (old = chunk.referee_name) && (new = old.swap old_name, new_name)
         
     | 
| 
      
 61 
     | 
    
         
            +
              chunk.referee_name = chunk.replace_reference old_name, new_name
         
     | 
| 
      
 62 
     | 
    
         
            +
              update_reference old.key, new.key
         
     | 
| 
      
 63 
     | 
    
         
            +
            end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
            def update_reference old_key, new_key
         
     | 
| 
      
 66 
     | 
    
         
            +
              Reference.where(referee_key: old_key).update_all referee_key: new_key
         
     | 
| 
      
 67 
     | 
    
         
            +
            end
         
     | 
    
        data/mod/core/set/all/states.rb
    CHANGED
    
    | 
         @@ -71,8 +71,8 @@ def new? 
     | 
|
| 
       71 
71 
     | 
    
         
             
              new_record? ||       # not yet in db (from ActiveRecord)
         
     | 
| 
       72 
72 
     | 
    
         
             
                !@from_trash.nil?  # in process of restoration from trash
         
     | 
| 
       73 
73 
     | 
    
         
             
            end
         
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
      
 74 
     | 
    
         
            +
            alias_method :new_card?, :new?
         
     | 
| 
      
 75 
     | 
    
         
            +
            alias_method :unreal?, :new?
         
     | 
| 
       76 
76 
     | 
    
         | 
| 
       77 
77 
     | 
    
         
             
            # has not been edited directly by human users.  bleep blorp.
         
     | 
| 
       78 
78 
     | 
    
         
             
            def pristine?
         
     |