private void initColumns(final RestFactory restFactory,
                             final UiConfigCache uiConfigCache,
                             final MyDataGrid<Job> dataGrid) {
        // Enabled.
        dataGrid.addResizableColumn(
                DataGridUtil.updatableTickBoxColumnBuilder(TickBoxState.createTickBoxFunc(Job::isEnabled))
                        .withFieldUpdater(
                                (rowIndex, job, tickBoxState) -> {
                                    job.setEnabled(tickBoxState.toBoolean());
                                    restFactory
                                            .create(JOB_RESOURCE)
                                            .call(res -> {
                                                res.setEnabled(job.getId(), tickBoxState.toBoolean());
                                            })
                                            .onSuccess(aVoid -> {
                                                dataGrid.redrawRow(rowIndex);
                                                JobChangeEvent.fire(JobListPresenter.this, job);
//                                                if (changeHandler != null) {
//                                                    changeHandler.accept(job);
//                                                }
                                            })
                                            .taskMonitorFactory(getView())
                                            .exec();
                                }
                        )
                        .build(),
                DataGridUtil.headingBuilder("Enabled")
                        .withToolTip("Whether this job is enabled. " +
                                     "The parent job and the node must both be enabled for the job to execute.")
                        .build(),
                ColumnSizeConstants.ENABLED_COL);

        // Job name, allow for null rows
        dataGrid.addResizableColumn(
                DataGridUtil.textColumnBuilder((Job job) -> NullSafe.get(job, Job::getName))
                        .enabledWhen(job -> NullSafe.isTrue(job, Job::isEnabled))
                        .build(),
                DataGridUtil.headingBuilder("Job")
                        .withToolTip("The name of the job")
                        .build(),
                350);

        // Help
        dataGrid.addColumn(
                DataGridUtil.svgPresetColumnBuilder(true, (Job job) -> SvgPresets.HELP)
                        .enabledWhen(job -> NullSafe.isTrue(job, Job::isEnabled))
                        .withBrowserEventHandler((context, elem, row, event) -> {
                            showHelp(uiConfigCache, row);
                        })
                        .build(),
                "<br/>", ColumnSizeConstants.ICON_COL);

        // Description col, allow for null rows
        dataGrid.addAutoResizableColumn(
                DataGridUtil.textColumnBuilder((Job job) -> NullSafe.get(job, Job::getDescription))
                        .enabledWhen(job -> NullSafe.isTrue(job, Job::isEnabled))
                        .build(),
                DataGridUtil.headingBuilder("Description")
                        .withToolTip("The description of the job")
                        .build(),
                300);

        DataGridUtil.addEndColumn(dataGrid);
    }
Top pane of JobPresenter (Jobs tab). Lists jobs (i.e. the parent job)
stroom-core-client/src/main/java/stroom/job/client/presenter/JobListPresenter.java