Class: Clir::DataManager::Manager::Editor
- Inherits:
-
Object
- Object
- Clir::DataManager::Manager::Editor
- Defined in:
- lib/clir/data_manager/Editor.rb
Instance Attribute Summary collapse
-
#manager ⇒ Object
readonly
Returns the value of attribute manager.
Instance Method Summary collapse
-
#all_required?(instance) ⇒ Boolean
pour l’instance donnée.
-
#confirmed?(instance) ⇒ Boolean
Confirmation (ou non) des données de l’instance.
- #edit(instance, options) ⇒ Object
-
#initialize(manager) ⇒ Editor
constructor
A new instance of Editor.
-
#set_choices_with(instance) ⇒ choices, index_default
Tty-prompt choices panel Should be update after each user input.
Constructor Details
#initialize(manager) ⇒ Editor
Returns a new instance of Editor.
22 23 24 |
# File 'lib/clir/data_manager/Editor.rb', line 22 def initialize(manager) @manager = manager end |
Instance Attribute Details
#manager ⇒ Object (readonly)
Returns the value of attribute manager.
20 21 22 |
# File 'lib/clir/data_manager/Editor.rb', line 20 def manager @manager end |
Instance Method Details
#all_required?(instance) ⇒ Boolean
pour l’instance donnée
78 79 80 81 82 83 84 85 |
# File 'lib/clir/data_manager/Editor.rb', line 78 def all_required?(instance) manager.properties.each do |property| if property.required?(instance) && instance.send(property.prop).nil? return false end end return true end |
#confirmed?(instance) ⇒ Boolean
Confirmation (ou non) des données de l’instance
69 70 71 72 73 74 |
# File 'lib/clir/data_manager/Editor.rb', line 69 def confirmed?(instance) clear unless debug? instance.show puts "\n\n" return Q.yes?(MSG[:q_confirm_data].jaune) end |
#edit(instance, options) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/clir/data_manager/Editor.rb', line 26 def edit(instance, ) data_modified = false data_saved = false error = nil while true # # Pour choisir la propriété à définir (et l'index par défaut) # choices, index_default = set_choices_with(instance) clear unless debug? # # Si une erreur a été rencontrée # puts error.rouge unless error.nil? # # L'user peut choisir la propriété à définir ou le choix # "Enregistrer" pour enregistrer l'instance # case prop = Q.select(([:question]||(MSG[:define_thing] % instance.class.class_name)).jaune, choices, { per_page:choices.count, default: (index_default unless choices.empty?), filter:true, show_help:false, echo:false} ) when NilClass break when :save if not(all_required?(instance)) error = MSG[:all_required_data_must_be_defined] elsif data_modified && confirmed?(instance) instance.save data_saved = true break end else modified = prop.edit(instance, ) data_modified = true if modified end end # / while if data_modified && not(data_saved) unless Q.yes?(MSG[:data_not_saved_cancel].orange) instance.save # on sauve les données, finalement end end end |
#set_choices_with(instance) ⇒ choices, index_default
Tty-prompt choices panel Should be update after each user input
At creation, index_default is the first required property which is undefined (1-start)
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
# File 'lib/clir/data_manager/Editor.rb', line 94 def set_choices_with(instance) requirement_missing = false max_label_width = 0 cs = manager.properties.map do |property| next if not(property.editable?(instance)) pvalue = property.formated_value_in(instance) pname = property.name(instance) pname || raise(ERRORS[:no_name_for_property] % property.prop.inspect) max_label_width = pname.length if pname.length > max_label_width [pname, pvalue] end.compact # Ajout de la gouttière entre label et valeur max_label_width += 4 # # Le menu qui devra être sélectionné # index_default = nil # # Index courant réel # # Avant qu'il existe des propriétés conditionnelles (:if) on # pouvait prendre l'index de la propriété pour savoir quel menu # sélectionner. Maintenant, on doit utiliser cette variable # +real_current_index+ pour connaitre l'index réel du menu à # sélectionner ensuite. # # On commence à 1 pour avoir le premier choix à 2 car le # premier item est toujours l'item "Enregistrer" # real_current_index = 1 # # Boucle pour récupérer tous les menus à afficher # cs = manager.properties.map do |property| # # Si ce n'est pas une propriété éditable (pas ses :specs), on # la passe. # next if not(property.editable?(instance)) # # Est-ce une propriété requise ? (en fonction ou non de l'instance) # is_required = property.required?(instance) real_current_index += 1 if index_default.nil? curval = instance.send(property.prop) isdef = curval != nil # # Si c'est une création d'instance, on se placera automati- # quement sur le premier champ (property) qui n'est pas défini # if index_default.nil? && instance.new? && not(isdef) index_default = real_current_index end # # Si c'est une propriété requise et qu'elle n'est pas définie, # on indique qu'il manque des définitions avant d'avoir la # possibilité d'enregistrer. On en profite aussi, si c'est la # première, pour définir l'index par défaut # if is_required && not(isdef) requirement_missing = true index_default = real_current_index if index_default.nil? end # choix = cs.shift # choix = "#{property.name(instance).ljust(max_label_width)}#{curval}" # # Faut-il utiliser une méthode de formatage d'affichage # fvalue = property.formated_value_in(instance) choix = "#{property.name(instance).ljust(max_label_width)}#{fvalue}" # # Couleur en fonction de propriété requise ou non # choix = choix.send(isdef ? :bleu : :orange) if is_required # # Marque de propriété requise # choix = (is_required ? '* '.rouge : ' ') + choix # # Le choice à utiliser # {name: choix, value: property} end.compact # # Si toutes les valeurs requises sont définies, on peut ajouter # un menu pour enregistrer # savable = not(requirement_missing) choix_save = {name: MSG[:save].send(savable ? :bleu : :gris), value: :save} choix_save.merge!(disabled: "(#{MESSAGES[:still_required_values]})".gris) if not(savable) cs.unshift(choix_save) # # On a toujours la possibilité d'annuler l'édition # cs << CHOIX_RENONCER # # Si l'index par défaut n'a pas pu être déterminé, on prend le # milieu de la liste de propriétés # index_default = cs.count / 2 if index_default.nil? # # On retourne la liste des choix et l'item sélectionné # return [cs, index_default] end |