def __call__(self, field, **kwargs): if field.data and type(field.data) is str: field.data = ast.literal_eval(field.data) selection = '' class_ = field.id if field.id != 'given_place' else 'place' headers_len = str(len(Table.HEADERS[class_])) # Make checkbox column sortable and show selected on top table = Table(Table.HEADERS[class_], order='[[' + headers_len + ', "desc"], [0, "asc"]]') # Table definitions (ordering and aligning) defs = '{"orderDataType": "dom-checkbox", "targets":' + headers_len + '}' if class_ == 'event': defs += ',{className: "dt-body-right", targets: [3,4]}' elif class_ in ['actor', 'group', 'feature', 'place']: defs += ',{className: "dt-body-right", targets: [2,3]}' table.defs = '[' + defs + ']' if class_ == 'place': aliases = current_user.settings['table_show_aliases'] entities = EntityMapper.get_by_system_type('place', nodes=True, aliases=aliases) else: entities = EntityMapper.get_by_codes(class_) for entity in entities: selection += entity.name + '<br/>' if field.data and entity.id in field.data else '' data = get_base_table_data(entity) data[0] = re.sub(re.compile('<a.*?>'), '', data[0]) # Remove links data.append( """<input type="checkbox" id="{id}" {checked} value="{name}" class="multi-table-select">""".format( id=str(entity.id), name=entity.name, checked='checked = "checked"' if field.data and entity.id in field.data else '')) table.rows.append(data) html = """ <span id="{name}-button" class="button">{change_label}</span><br /> <div id="{name}-selection" class="selection" style="text-align:left;">{selection}</div> <div id="{name}-overlay" class="overlay"> <div id="{name}-dialog" class="overlay-container">{table}</div></div> <script> $(document).ready(function () {{createOverlay("{name}", "{title}", true);}}); </script>""".format(name=field.id, change_label=uc_first(_('change')), title=_(field.id.replace('_', ' ')), selection=selection, table=table.display(field.id)) return super(TableMultiSelect, self).__call__(field, **kwargs) + html
def __call__(self, field: TableField, **kwargs: Any) -> TableMultiSelect: if field.data and isinstance(field.data, str): field.data = ast.literal_eval(field.data) class_ = field.id if field.id != 'given_place' else 'place' # Make checkbox column sortable and show selected on top table = Table([''] + g.table_headers[class_], order=[[0, 'desc'], [1, 'asc']]) # Table definitions (ordering and aligning) table.defs = [{'orderDataType': 'dom-checkbox', 'targets': 0}] if class_ == 'event': table.defs.append({ 'className': 'dt-body-right', 'targets': [4, 5] }) elif class_ in ['actor', 'group', 'feature', 'place']: table.defs.append({ 'className': 'dt-body-right', 'targets': [3, 4] }) if class_ in ['group', 'person', 'place']: entities = Entity.get_by_class( class_, nodes=True, aliases=current_user.settings['table_show_aliases']) else: entities = Entity.get_by_view(class_) for entity in entities: data = get_base_table_data(entity) data[0] = re.sub(re.compile('<a.*?>'), '', data[0]) # Remove links data.insert( 0, """<input type="checkbox" id="{id}" {checked} value="{name}" class="multi-table-select">""".format( id=str(entity.id), name=entity.name, checked='checked = "checked"' if field.data and entity.id in field.data else '')) table.rows.append(data) selection = [ entity.name for entity in entities if field.data and entity.id in field.data ] html = """ <span id="{name}-button" class="{button_class}" onclick="$('#{name}-modal').modal('show')"> {change_label} </span><br> <div id="{name}-selection" class="selection" style="text-align:left;">{selection}</div> <div id="{name}-modal" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true"> <div class="modal-dialog" role="document" style="max-width: 100%!important;"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">{title}</h5> <button type="button" class="btn btn-outline-primary btn-sm" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body">{table}</div> <div class="modal-footer"> <button type="button" class="btn btn-outline-primary btn-sm" data-dismiss="modal" onclick="selectFromTableMulti('{name}')"> {close_label} </button> </div> </div> </div> </div> <script> </script>""".format( name=field.id, button_class=app.config['CSS']['button']['secondary'], change_label=uc_first(_('change')), close_label=uc_first(_('close')), title=uc_first(_(field.id.replace('_', ' '))), selection='<br>'.join(selection), table=table.display(field.id)) return super(TableMultiSelect, self).__call__(field, **kwargs) + html