コード例 #1
0
    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
コード例 #2
0
    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">&times;</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