/**
  * @param LexProjectModel $projectModel
  * @param string $fieldName
  * @param string $jsonFilePath
  * @return bool true on success, false otherwise
  * @throws \Exception
  */
 public static function CreateFromJson($projectModel, $fieldName, $jsonFilePath)
 {
     $optionList = new LexOptionListModel($projectModel);
     $listCode = LexConfig::flexOptionlistCode($fieldName);
     if (!$optionList->readByProperty('code', $listCode)) {
         $optionList->name = LexConfig::flexOptionlistName($listCode);
         $optionList->code = $listCode;
         $optionList->canDelete = false;
         $optionList->readFromJson($jsonFilePath);
         $optionList->write();
         return true;
     }
     return false;
 }
 public function __construct()
 {
     $this->tasks = new MapOf(function ($data) {
         switch ($data['type']) {
             case LexTask::DASHBOARD:
                 return new LexTaskDashboard();
             case LexTask::SEMDOM:
                 return new LexTaskSemdom();
             default:
                 return new LexTask();
         }
     });
     $this->roleViews = new MapOf(function () {
         return new LexRoleViewConfig();
     });
     $this->userViews = new MapOf(function () {
         return new LexUserViewConfig();
     });
     // default tasks values
     $this->tasks[LexTask::VIEW] = new LexTask();
     $this->tasks[LexTask::DASHBOARD] = new LexTaskDashboard();
     $this->tasks[LexTask::GATHERTEXTS] = new LexTask();
     $this->tasks[LexTask::SEMDOM] = new LexTaskSemdom();
     $this->tasks[LexTask::WORDLIST] = new LexTask();
     $this->tasks[LexTask::DBE] = new LexTask();
     $this->tasks[LexTask::ADDMEANINGS] = new LexTask();
     $this->tasks[LexTask::ADDGRAMMAR] = new LexTask();
     $this->tasks[LexTask::ADDEXAMPLES] = new LexTask();
     $this->tasks[LexTask::REVIEW] = new LexTask();
     $this->tasks[LexTask::IMPORTEXPORT] = new LexTask();
     $this->tasks[LexTask::CONFIGURATION] = new LexTask();
     // default entry fields values
     $this->entry = new LexConfigFieldList();
     $this->entry->fieldOrder[] = LexConfig::LEXEME;
     $this->entry->fieldOrder[] = LexConfig::CITATIONFORM;
     //$this->entry->fieldOrder[] = LexConfig::ENVIRONMENTS; // Disabled 05-2016
     $this->entry->fieldOrder[] = LexConfig::PRONUNCIATION;
     $this->entry->fieldOrder[] = LexConfig::CVPATTERN;
     $this->entry->fieldOrder[] = LexConfig::TONE;
     $this->entry->fieldOrder[] = LexConfig::LOCATION;
     $this->entry->fieldOrder[] = LexConfig::ETYMOLOGY;
     $this->entry->fieldOrder[] = LexConfig::ETYMOLOGYGLOSS;
     $this->entry->fieldOrder[] = LexConfig::ETYMOLOGYCOMMENT;
     $this->entry->fieldOrder[] = LexConfig::ETYMOLOGYSOURCE;
     $this->entry->fieldOrder[] = LexConfig::NOTE;
     $this->entry->fieldOrder[] = LexConfig::LITERALMEANING;
     $this->entry->fieldOrder[] = LexConfig::ENTRYBIBLIOGRAPHY;
     $this->entry->fieldOrder[] = LexConfig::ENTRYRESTRICTIONS;
     $this->entry->fieldOrder[] = LexConfig::SUMMARYDEFINITION;
     $this->entry->fieldOrder[] = LexConfig::ENTRYIMPORTRESIDUE;
     $this->entry->fieldOrder[] = LexConfig::SENSES_LIST;
     $this->entry->fields[LexConfig::LEXEME] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::LEXEME]->label = 'Word';
     $this->entry->fields[LexConfig::LEXEME]->inputSystems[] = 'th';
     $this->entry->fields[LexConfig::SENSES_LIST] = new LexConfigFieldList();
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::DEFINITION;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::GLOSS;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::PICTURES;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::POS;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SEMDOM;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SCIENTIFICNAME;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::ANTHROPOLOGYNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SENSEBIBLIOGRAPHY;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::DISCOURSENOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::ENCYCLOPEDICNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::GENERALNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::GRAMMARNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::PHONOLOGYNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SENSERESTRCTIONS;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SEMANTICSNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SOCIOLINGUISTICSNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SOURCE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::USAGES;
     //$this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::REVERSALENTRIES; // Disabled 05-2016
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SENSETYPE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::ACADEMICDOMAINS;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SENSEPUBLISHIN;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::ANTHROPOLOGYCATEGORIES;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SENSEIMPORTRESIDUE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::STATUS;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::EXAMPLES_LIST;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DEFINITION] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DEFINITION]->label = 'Definition';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DEFINITION]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::POS] = new LexConfigOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::POS);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::POS]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::POS]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMDOM] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::SEMDOM);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMDOM]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMDOM]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST] = new LexConfigFieldList();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fieldOrder[] = LexConfig::EXAMPLE_SENTENCE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fieldOrder[] = LexConfig::EXAMPLE_TRANSLATION;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fieldOrder[] = LexConfig::REFERENCE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fieldOrder[] = LexConfig::EXAMPLEPUBLISHIN;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLE_SENTENCE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLE_SENTENCE]->label = 'Sentence';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLE_SENTENCE]->inputSystems[] = 'th';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLE_TRANSLATION] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLE_TRANSLATION]->label = 'Translation';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLE_TRANSLATION]->inputSystems[] = 'en';
     //$this->entry->fields[LexConfig::CUSTOM_FIELDS_LIST] = new LexConfigFieldList();
     //$this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::CUSTOM_FIELDS_LIST] = new LexConfigFieldList();
     //$this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::CUSTOM_FIELDS_LIST] = new LexConfigFieldList();
     /*  Configuration for less common fields (mostly used in FLEx are defined below) */
     $this->entry->fields[LexConfig::CITATIONFORM] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::CITATIONFORM]->label = 'Citation Form';
     $this->entry->fields[LexConfig::CITATIONFORM]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::CITATIONFORM]->inputSystems[] = 'th';
     /*
     ENVIRONMENTS disabled 05-2016
     $this->entry->fields[LexConfig::ENVIRONMENTS] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::ENVIRONMENTS);
     $this->entry->fields[LexConfig::ENVIRONMENTS]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::ENVIRONMENTS]->listCode = $listCode;
     $this->entry->fields[LexConfig::ENVIRONMENTS]->hideIfEmpty = true;
     */
     $this->entry->fields[LexConfig::PRONUNCIATION] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::PRONUNCIATION]->label = 'Pronunciation';
     $this->entry->fields[LexConfig::PRONUNCIATION]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::PRONUNCIATION]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::CVPATTERN] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::CVPATTERN]->label = 'CV Pattern';
     $this->entry->fields[LexConfig::CVPATTERN]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::CVPATTERN]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::TONE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::TONE]->label = 'Tone';
     $this->entry->fields[LexConfig::TONE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::TONE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::LOCATION] = new LexConfigOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::LOCATION);
     $this->entry->fields[LexConfig::LOCATION]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::LOCATION]->listCode = $listCode;
     $this->entry->fields[LexConfig::LOCATION]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ETYMOLOGY] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ETYMOLOGY]->label = 'Etymology';
     $this->entry->fields[LexConfig::ETYMOLOGY]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ETYMOLOGY]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::ETYMOLOGYGLOSS] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ETYMOLOGYGLOSS]->label = 'Etymology Gloss';
     $this->entry->fields[LexConfig::ETYMOLOGYGLOSS]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ETYMOLOGYGLOSS]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::ETYMOLOGYCOMMENT] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ETYMOLOGYCOMMENT]->label = 'Etymology Comment';
     $this->entry->fields[LexConfig::ETYMOLOGYCOMMENT]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ETYMOLOGYCOMMENT]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::ETYMOLOGYSOURCE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ETYMOLOGYSOURCE]->label = 'Etymology Source';
     $this->entry->fields[LexConfig::ETYMOLOGYSOURCE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ETYMOLOGYSOURCE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::NOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::NOTE]->label = 'Note';
     $this->entry->fields[LexConfig::NOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::NOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::LITERALMEANING] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::LITERALMEANING]->label = 'Literal Meaning';
     $this->entry->fields[LexConfig::LITERALMEANING]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::LITERALMEANING]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::ENTRYBIBLIOGRAPHY] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ENTRYBIBLIOGRAPHY]->label = 'Bibliography';
     $this->entry->fields[LexConfig::ENTRYBIBLIOGRAPHY]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ENTRYBIBLIOGRAPHY]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::ENTRYRESTRICTIONS] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ENTRYRESTRICTIONS]->label = 'Restrictions';
     $this->entry->fields[LexConfig::ENTRYRESTRICTIONS]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ENTRYRESTRICTIONS]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SUMMARYDEFINITION] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SUMMARYDEFINITION]->label = 'Summary Definition';
     $this->entry->fields[LexConfig::SUMMARYDEFINITION]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SUMMARYDEFINITION]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::ENTRYIMPORTRESIDUE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ENTRYIMPORTRESIDUE]->label = 'Import Residue';
     $this->entry->fields[LexConfig::ENTRYIMPORTRESIDUE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ENTRYIMPORTRESIDUE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GLOSS] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GLOSS]->label = 'Gloss';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GLOSS]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GLOSS]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PICTURES] = new LexConfigPictures();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PICTURES]->label = 'Pictures';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PICTURES]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PICTURES]->captionLabel = 'Captions';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PICTURES]->captionHideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PICTURES]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SCIENTIFICNAME] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SCIENTIFICNAME]->label = 'Scientific Name';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SCIENTIFICNAME]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SCIENTIFICNAME]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYNOTE]->label = 'Anthropology Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEBIBLIOGRAPHY] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEBIBLIOGRAPHY]->label = 'Bibliography';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEBIBLIOGRAPHY]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEBIBLIOGRAPHY]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DISCOURSENOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DISCOURSENOTE]->label = 'Discourse Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DISCOURSENOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DISCOURSENOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ENCYCLOPEDICNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ENCYCLOPEDICNOTE]->label = 'Encyclopedic Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ENCYCLOPEDICNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ENCYCLOPEDICNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GENERALNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GENERALNOTE]->label = 'General Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GENERALNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GENERALNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GRAMMARNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GRAMMARNOTE]->label = 'Grammar Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GRAMMARNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GRAMMARNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PHONOLOGYNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PHONOLOGYNOTE]->label = 'Phonology Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PHONOLOGYNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PHONOLOGYNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSERESTRCTIONS] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSERESTRCTIONS]->label = 'Restrictions';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSERESTRCTIONS]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSERESTRCTIONS]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMANTICSNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMANTICSNOTE]->label = 'Semantics Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMANTICSNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMANTICSNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOCIOLINGUISTICSNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOCIOLINGUISTICSNOTE]->label = 'Sociolinguistics Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOCIOLINGUISTICSNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOCIOLINGUISTICSNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOURCE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOURCE]->label = 'Source';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOURCE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOURCE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::USAGES] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::USAGES);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::USAGES]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::USAGES]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::USAGES]->hideIfEmpty = true;
     // TODO This needs to be a taglist DDW 2014-07
     /*
     REVERSALENTRIES disabled 05-2016
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::REVERSALENTRIES] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::REVERSALENTRIES);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::REVERSALENTRIES]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::REVERSALENTRIES]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::REVERSALENTRIES]->hideIfEmpty = true;
     */
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSETYPE] = new LexConfigOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::SENSETYPE);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSETYPE]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSETYPE]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSETYPE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ACADEMICDOMAINS] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::ACADEMICDOMAINS);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ACADEMICDOMAINS]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ACADEMICDOMAINS]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ACADEMICDOMAINS]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEPUBLISHIN] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::SENSEPUBLISHIN);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEPUBLISHIN]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEPUBLISHIN]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEPUBLISHIN]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYCATEGORIES] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::ANTHROPOLOGYCATEGORIES);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYCATEGORIES]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYCATEGORIES]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYCATEGORIES]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEIMPORTRESIDUE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEIMPORTRESIDUE]->label = 'Import Residue';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEIMPORTRESIDUE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEIMPORTRESIDUE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::STATUS] = new LexConfigOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::STATUS);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::STATUS]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::STATUS]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::STATUS]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::REFERENCE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::REFERENCE]->label = 'Reference';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::REFERENCE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::REFERENCE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLEPUBLISHIN] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::EXAMPLEPUBLISHIN);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLEPUBLISHIN]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLEPUBLISHIN]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLEPUBLISHIN]->hideIfEmpty = true;
     // default role views values
     $this->roleViews[LexRoles::OBSERVER] = new LexRoleViewConfig();
     $this->roleViews[LexRoles::OBSERVER_WITH_COMMENT] = new LexRoleViewConfig();
     $this->roleViews[LexRoles::CONTRIBUTOR] = new LexRoleViewConfig();
     $this->roleViews[LexRoles::MANAGER] = new LexRoleViewConfig();
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::LEXEME] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::DEFINITION] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::POS] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SEMDOM] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::EXAMPLE_SENTENCE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::EXAMPLE_TRANSLATION] = new LexViewMultiTextFieldConfig(true);
     // Less common fields are visible by default
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::GLOSS] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::PICTURES] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::CITATIONFORM] = new LexViewMultiTextFieldConfig(true);
     //$this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ENVIRONMENTS] = new LexViewFieldConfig(true); // Disabled 05-2016
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::PRONUNCIATION] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::CVPATTERN] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::TONE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::LOCATION] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ETYMOLOGY] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ETYMOLOGYGLOSS] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ETYMOLOGYCOMMENT] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ETYMOLOGYSOURCE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::NOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::LITERALMEANING] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ENTRYBIBLIOGRAPHY] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ENTRYRESTRICTIONS] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SUMMARYDEFINITION] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ENTRYIMPORTRESIDUE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SCIENTIFICNAME] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ANTHROPOLOGYNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SENSEBIBLIOGRAPHY] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::DISCOURSENOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ENCYCLOPEDICNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::GENERALNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::GRAMMARNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::PHONOLOGYNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SENSERESTRCTIONS] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SEMANTICSNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SOCIOLINGUISTICSNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SOURCE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::USAGES] = new LexViewFieldConfig(true);
     //$this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::REVERSALENTRIES] = new LexViewFieldConfig(true); // Disabled 05-2016
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SENSETYPE] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ACADEMICDOMAINS] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SENSEPUBLISHIN] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ANTHROPOLOGYCATEGORIES] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SENSEIMPORTRESIDUE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::STATUS] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::REFERENCE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::EXAMPLEPUBLISHIN] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER_WITH_COMMENT]->fields = clone $this->roleViews[LexRoles::OBSERVER]->fields;
     $this->roleViews[LexRoles::CONTRIBUTOR]->fields = clone $this->roleViews[LexRoles::OBSERVER]->fields;
     $this->roleViews[LexRoles::MANAGER]->fields = clone $this->roleViews[LexRoles::OBSERVER]->fields;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::VIEW] = true;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::DASHBOARD] = true;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::GATHERTEXTS] = false;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::SEMDOM] = false;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::WORDLIST] = false;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::DBE] = true;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::ADDMEANINGS] = false;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::ADDGRAMMAR] = false;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::ADDEXAMPLES] = false;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::REVIEW] = false;
     $this->roleViews[LexRoles::OBSERVER_WITH_COMMENT]->showTasks = clone $this->roleViews[LexRoles::OBSERVER]->showTasks;
     $this->roleViews[LexRoles::CONTRIBUTOR]->showTasks = clone $this->roleViews[LexRoles::OBSERVER]->showTasks;
     $this->roleViews[LexRoles::CONTRIBUTOR]->showTasks[LexTask::ADDMEANINGS] = true;
     $this->roleViews[LexRoles::CONTRIBUTOR]->showTasks[LexTask::ADDGRAMMAR] = true;
     $this->roleViews[LexRoles::CONTRIBUTOR]->showTasks[LexTask::ADDEXAMPLES] = true;
     $this->roleViews[LexRoles::MANAGER]->showTasks = clone $this->roleViews[LexRoles::CONTRIBUTOR]->showTasks;
     $this->roleViews[LexRoles::MANAGER]->showTasks[LexTask::GATHERTEXTS] = true;
     $this->roleViews[LexRoles::MANAGER]->showTasks[LexTask::SEMDOM] = true;
     $this->roleViews[LexRoles::MANAGER]->showTasks[LexTask::WORDLIST] = true;
     $this->roleViews[LexRoles::MANAGER]->showTasks[LexTask::REVIEW] = true;
 }
 public function testLiftImportMerge_ExistingData_RangesChanged()
 {
     $liftFilePath = self::$environ->createTestLiftFile(self::liftWithRangesV0_13, 'LiftWithRangesV0_13.lift');
     self::$environ->createTestLiftFile(self::liftRangesV0_13, 'TestLangProj.lift-ranges');
     $project = self::$environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $mergeRule = LiftMergeRule::IMPORT_WINS;
     $skipSameModTime = false;
     LiftImport::get()->merge($liftFilePath, $project, $mergeRule, $skipSameModTime);
     $optionList = new LexOptionListModel($project);
     $optionList->readByProperty('code', LexConfig::flexOptionlistCode(LexConfig::POS));
     $this->assertEquals(3, $optionList->items->count());
     $this->assertEquals('article', $optionList->items[0]->value);
     self::$environ->createTestLiftFile(self::liftRangesAnotherPosV0_13, 'TestLangProj.lift-ranges');
     $importer = LiftImport::get()->merge($liftFilePath, $project, $mergeRule, $skipSameModTime);
     $this->assertEquals(1, $importer->stats->existingEntries);
     $optionList = new LexOptionListModel($project);
     $optionList->readByProperty('code', LexConfig::flexOptionlistCode(LexConfig::ANTHROPOLOGYCATEGORIES));
     $this->assertEquals(0, $optionList->items->count());
     $optionList->readByProperty('code', LexConfig::flexOptionlistCode(LexConfig::STATUS));
     $this->assertEquals(4, $optionList->items->count());
     $optionList->readByProperty('code', LexConfig::flexOptionlistCode(LexConfig::ACADEMICDOMAINS));
     $this->assertEquals(2, $optionList->items->count());
     $optionList->readByProperty('code', LexConfig::flexOptionlistCode(LexConfig::POS));
     $this->assertEquals(1, $optionList->items->count());
     $this->assertEquals('adjunct', $optionList->items[0]->value);
 }